diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 897be2bcc9..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,16 +0,0 @@ -node_modules -dist -python -templates/neuroglancer/sliceview -src/third_party/jpgjs/jpg.js -templates -build -.tox -.nox -/lib -python -config -typings -src/mesh/draco/stub.js -tsconfig.tsbuildinfo -/examples diff --git a/.eslintrc.yml b/.eslintrc.yml deleted file mode 100644 index e033486195..0000000000 --- a/.eslintrc.yml +++ /dev/null @@ -1,68 +0,0 @@ -root: true -parser: "@typescript-eslint/parser" -plugins: - - "@typescript-eslint" - - "import" -settings: - "import/parsers": - "@typescript-eslint/parser": [".ts", ".tsx"] - "import/resolver": - "typescript": - "node": -extends: - - "eslint:recommended" - - "plugin:@typescript-eslint/eslint-recommended" - - "plugin:@typescript-eslint/recommended" - - "plugin:import/recommended" -rules: - "@typescript-eslint/no-explicit-any": "off" - "@typescript-eslint/explicit-module-boundary-types": "off" - "@typescript-eslint/no-non-null-assertion": "off" - "@typescript-eslint/no-inferrable-types": "off" - "@typescript-eslint/no-this-alias": "off" - "@typescript-eslint/no-empty-function": "off" - "@typescript-eslint/no-empty-interface": "off" - "prefer-const": - - "error" - - destructuring: "all" - "no-constant-condition": "off" - "@typescript-eslint/no-unused-vars": - - "error" - - argsIgnorePattern: "^_" - ignoreRestSiblings: true - "@typescript-eslint/ban-types": - - "error" - - types: - # unban Function - "Function": false - extendDefaults: true - "no-unsafe-finally": "off" - "require-yield": "off" - "no-inner-declarations": "off" - "import/no-named-as-default": "off" - "import/no-named-as-default-member": "off" - "import/no-cycle": "error" - "@typescript-eslint/consistent-type-imports": "error" - "import/no-unresolved": "error" - "import/no-extraneous-dependencies": "error" - "import/first": "error" - "import/order": - - "error" - - groups: - - "builtin" - - "external" - - "internal" - alphabetize: - order: "asc" - orderImportKind: "asc" -overrides: - - files: - - "src/**/*" - rules: - "no-restricted-imports": - - "error" - - patterns: - - group: - - "./" - - "../" - message: "Relative imports are not allowed." diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0c6d1ad621..013e33b688 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,6 +7,13 @@ on: tags: - v** pull_request: + workflow_dispatch: + inputs: + debug_enabled: + type: boolean + description: "Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)" + required: false + default: false jobs: client: @@ -24,12 +31,20 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x cache: "npm" cache-dependency-path: | package-lock.json - examples/**/package-lock.json - - run: npm install + # uv required for javascript tests + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: false + # go needed for fake_gcs_server used by the javascript tests + - name: Setup go + uses: actions/setup-go@v5 + with: + go-version: "stable" + - run: npm ci - run: npm run format:fix - name: Check for dirty working directory run: git diff --exit-code @@ -47,7 +62,6 @@ jobs: - run: npm run build-package - run: npm publish --dry-run working-directory: dist/package - - uses: ./.github/actions/setup-firefox - name: Run JavaScript tests (including WebGL) run: npm test if: ${{ runner.os != 'macOS' }} @@ -68,6 +82,36 @@ jobs: name: client path: dist/client if: ${{ runner.os == 'Linux' }} + example-project-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + - uses: actions/setup-node@v4 + with: + node-version: 22.x + cache: "pnpm" + cache-dependency-path: | + examples/**/pnpm-lock.yaml + - uses: actions/setup-node@v4 + with: + node-version: 22.x + cache: "npm" + cache-dependency-path: | + package-lock.json + - run: npm ci + - run: npm run example-project-test -- --reporter=html + - name: Upload report and built clients + uses: actions/upload-artifact@v4 + if: ${{ !cancelled() }} + with: + name: example-project-test-results + path: | + playwright-report/ + examples/*/*/dist/ # Builds Python package and runs Python tests # @@ -92,17 +136,17 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - # Uncomment the action below for an interactive shell - # - name: Setup tmate session - # uses: mxschmitt/action-tmate@v3 + - uses: ./.github/actions/setup-firefox + - name: Setup tmate session + uses: mxschmitt/action-tmate@v3 + if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_enabled }} - name: Install Python packaging/test tools run: pip install tox nox wheel numpy -r python/requirements-test.txt - - uses: ./.github/actions/setup-firefox - run: nox -s lint format mypy - name: Check for dirty working directory run: git diff --exit-code @@ -139,7 +183,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x cache: "npm" - name: Set up Python uses: actions/setup-python@v5 @@ -149,7 +193,7 @@ jobs: id: pip-cache run: | echo "dir=$(pip cache dir)" >> "$GITHUB_OUTPUT" - - run: npm install + - run: npm ci - run: | build_info="{'tag':'$(git describe --always --tags)', 'url':'https://github.com/google/neuroglancer/commit/$(git rev-parse HEAD)', 'timestamp':'$(date)'}" npm run build-python -- --no-typecheck --no-lint --define NEUROGLANCER_BUILD_INFO="${build_info}" @@ -214,7 +258,7 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: 20.x + node-version: 22.x registry-url: "https://registry.npmjs.org" - uses: actions/download-artifact@v4 with: diff --git a/.github/workflows/build_preview.yml b/.github/workflows/build_preview.yml index 9dcac7d1e1..7a6c997612 100644 --- a/.github/workflows/build_preview.yml +++ b/.github/workflows/build_preview.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: node-version: - - "20.x" + - "22.x" runs-on: ubuntu-latest steps: diff --git a/.gitignore b/.gitignore index b07078cb6e..07243e00f7 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,8 @@ tsconfig.tsbuildinfo .eslintcache /lib /.firebase +/test-results +/playwright-report +-/docs/python/api/index.rst +/docs/python/api/*.rst +/.vite diff --git a/.ncurc.yml b/.ncurc.yml new file mode 100644 index 0000000000..4250db1cf6 --- /dev/null +++ b/.ncurc.yml @@ -0,0 +1,5 @@ +reject: + # API break + - "gl-matrix" + - "@types/gl-matrix" + - "codemirror" diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000000..233b836869 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,61 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["import", "typescript", "oxc", "unicorn", "promise", "vitest"], + "env": { + "browser": true + }, + "settings": {}, + "rules": { + // Seems to be buggy + "no-loss-of-precision": "off", + "import/no-cycle": "error", + "import/first": "error", + "no-unsafe-finally": "off", + "require-yield": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + "erasing-op": "off", + "no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ], + "no-new-array": "off", + "no-document-cookie": "off", + "@typescript-eslint/consistent-type-imports": "error" + }, + "overrides": [ + { + "files": ["*.test.ts", "*.spec.ts"], + "rules": { + "@typescript-eslint/no-explicit-any": "off" + } + } + ], + "ignorePatterns": [ + "**/node_modules", + "**/dist", + "**/python", + "templates/neuroglancer/sliceview", + "src/third_party/jpgjs/jpg.js", + "**/templates", + "**/build", + "**/.tox", + "**/.nox", + "**/.venv", + "lib", + "**/python", + "**/config", + "**/typings", + "src/mesh/draco/stub.js", + "**/tsconfig.tsbuildinfo", + "examples" + ] +} diff --git a/.prettierignore b/.prettierignore index 42541345da..792e75c76b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,9 +1,13 @@ /templates/ /python/ /third_party/jpgjs/jpg.js -/testdata/*.json +/testdata/ +zarr.json .parcel-cache dist /lib -/docs/_build/ /.ruff_cache +package.json +package-lock.json +.venv +pnpm-lock.yaml diff --git a/MANIFEST.in b/MANIFEST.in index 6d3dbc6240..54472f0285 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -14,7 +14,6 @@ prune examples exclude .clang-format exclude .editorconfig exclude .eslintignore -exclude .eslintrc exclude .style.yapf exclude cors_webserver.py exclude gulpfile.js @@ -36,8 +35,9 @@ exclude MANIFEST.in exclude *.ts exclude .prettierrc.yml exclude .prettierignore -exclude .eslintrc.yml +exclude eslint.config.js +exclude .ncurc.yml exclude index.html -exclude webpack.config.js +exclude rspack.config.js exclude firebase.json exclude .firebaserc diff --git a/README.md b/README.md index 67ce4388fd..899f82167f 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ Neuroglancer is a WebGL-based viewer for volumetric data. It is capable of displaying arbitrary (non axis-aligned) cross-sectional views of volumetric data, as well as 3-D meshes and line-segment based models (skeletons). +Refer to the documentation website at https://neuroglancer-docs.web.app for more details. + This is not an official Google product. # Examples @@ -157,6 +159,7 @@ There is a Google Group/mailing list for discussion related to Neuroglancer: # Related Projects +- [Panel-Neuroglancer](https://github.com/panel-extensions/panel-neuroglancer) - Integrate Neuroglancer into Jupyter notebook workflows and Python web apps with this HoloViz Panel extension. - [TensorStore](https://github.com/google/tensorstore) - C++ and Python library for efficiently reading and writing multi-dimensional arrays in formats supported by Neuroglancer. - [4Quant/neuroglancer-docker](https://github.com/4Quant/neuroglancer-docker) - Example setup for diff --git a/build_tools/after-version-change.ts b/build_tools/after-version-change.ts index 67d88c04c5..12f33161f0 100644 --- a/build_tools/after-version-change.ts +++ b/build_tools/after-version-change.ts @@ -20,16 +20,25 @@ await execFileAsync("npm", ["run", "build-package"], { cwd: rootDir, }); -// Update package-lock.json files in examples. +// Update lockfiles in examples. await Promise.all( (await glob("examples/*/*/package.json", { absolute: true, cwd: rootDir })) .map((examplePackageJsonPath) => path.dirname(examplePackageJsonPath)) .map(async (exampleDir: string) => { - await execFileAsync("npm", ["install", "--no-audit", "--no-fund"], { - cwd: exampleDir, - }); - await execFileAsync("git", ["add", "package-lock.json"], { + await execFileAsync("pnpm", ["install"], { cwd: exampleDir, }); }), ); + +await execFileAsync( + "git", + [ + "add", + ...(await glob("examples/*/*/pnpm-lock.yaml", { + absolute: false, + cwd: rootDir, + })), + ], + { cwd: rootDir }, +); diff --git a/build_tools/build-package.ts b/build_tools/build-package.ts index 32c80a00b5..957fa24da4 100644 --- a/build_tools/build-package.ts +++ b/build_tools/build-package.ts @@ -32,8 +32,11 @@ function buildDeclarationFiles( program.emit(); } -async function buildPackage(options: { inplace?: boolean }) { - const { inplace = false } = options; +export async function buildPackage(options: { + inplace?: boolean; + skipDeclarations?: boolean; +}) { + const { inplace = false, skipDeclarations = false } = options; const srcDir = path.resolve(rootDir, "src"); const outDir = inplace ? rootDir : path.resolve(rootDir, "dist", "package"); @@ -68,6 +71,7 @@ async function buildPackage(options: { inplace?: boolean }) { outbase: srcDir, bundle: false, outdir: libDir, + target: "es2022", }); let compilerOptionsFromConfigFile: ts.CompilerOptions = {}; @@ -80,10 +84,12 @@ async function buildPackage(options: { inplace?: boolean }) { "./", ).options; } - buildDeclarationFiles(entryPoints, { - ...compilerOptionsFromConfigFile, - outDir: libDir, - }); + if (!skipDeclarations) { + buildDeclarationFiles(entryPoints, { + ...compilerOptionsFromConfigFile, + outDir: libDir, + }); + } const otherSources = await glob(["**/*.{css,js,html,wasm}"], { cwd: srcDir, @@ -117,26 +123,41 @@ async function buildPackage(options: { inplace?: boolean }) { const { postpack } = packageJson["scripts"]; delete packageJson["scripts"]; packageJson["scripts"] = { postpack }; + packageJson["files"] = ["lib/**/*"]; } else { delete packageJson["private"]; packageJson["scripts"] = {}; delete packageJson["files"]; } - function convertExportMap(map: Record) { - for (const [key, value] of Object.entries(map)) { + const EXCLUDED_EXPORT_KEYS = /^#test/; + + function convertExportMap( + map: Record, + isConditions: boolean = false, + ) { + const entries = Object.entries(map); + map = {}; + for (const [key, value] of entries) { + if (!isConditions && key.match(EXCLUDED_EXPORT_KEYS) !== null) { + continue; + } + if (isConditions && key === "node") { + continue; + } if (typeof value === "string") { map[key] = value .replace(/\.ts$/, ".js") .replace(/^\.\/src\//, "./lib/"); } else { - convertExportMap(value); + map[key] = convertExportMap(value, /*isConditions=*/ true); } } + return map; } - convertExportMap(packageJson["imports"]); - convertExportMap(packageJson["exports"]); + packageJson["imports"] = convertExportMap(packageJson["imports"]); + packageJson["exports"] = convertExportMap(packageJson["exports"]); const outputPackageJson = path.resolve(outDir, "package.json"); const tempPackageJsonPath = outputPackageJson + ".tmp"; @@ -156,6 +177,11 @@ async function parseArgsAndRunMain() { default: false, description: "Convert package to built format inplace.", }, + ["skip-declarations"]: { + type: "boolean", + default: false, + description: "Skip generating .d.ts files.", + }, ["if-not-toplevel"]: { type: "boolean", default: false, @@ -193,7 +219,10 @@ async function parseArgsAndRunMain() { return; } } - buildPackage({ inplace: argv.inplace }); + buildPackage({ + inplace: argv.inplace, + skipDeclarations: argv.skipDeclarations, + }); } if (process.argv[1] === import.meta.filename) { diff --git a/build_tools/cli.ts b/build_tools/cli.ts index 854871136c..a217c5d01a 100644 --- a/build_tools/cli.ts +++ b/build_tools/cli.ts @@ -16,18 +16,17 @@ // Command-line interface for building Neuroglancer. -/// - import process from "node:process"; import { pathToFileURL } from "node:url"; import path from "path"; -import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin"; -import type { Configuration } from "webpack"; -import webpackCli from "webpack-cli/lib/bootstrap.js"; // eslint-disable-line import/default +import { RspackCLI } from "@rspack/cli"; +import type { Configuration } from "@rspack/core"; +import ESLintPlugin from "eslint-rspack-plugin"; +import { TsCheckerRspackPlugin } from "ts-checker-rspack-plugin"; import * as webpackMerge from "webpack-merge"; import yargs from "yargs"; -import { normalizeConfigurationWithDefine } from "./webpack/configuration_with_define.js"; -import { setConfig } from "./webpack/webpack_config_from_cli.cjs"; +import { normalizeConfigurationWithDefine } from "./rspack/configuration_with_define.js"; +import { setConfig } from "./rspack/rspack_config_from_cli.js"; export interface WebpackConfigurationWithDefine extends Configuration { define?: Record | undefined; @@ -81,7 +80,7 @@ async function getWebpackConfig( ...extraConfigs: WebpackConfigurationWithDefine[] ): Promise<(...args: any[]) => Configuration> { const configPaths = [ - pathToFileURL(path.resolve(import.meta.dirname, "../webpack.config.js")) + pathToFileURL(path.resolve(import.meta.dirname, "../rspack.config.js")) .href, ...argv.config.map((configPath) => pathToFileURL(configPath).href), ]; @@ -109,15 +108,15 @@ async function getWebpackConfig( outDir = path.resolve(outDir); } const plugins = []; - if (argv.typecheck || argv.lint) { + if (argv.typecheck) { + plugins.push(new TsCheckerRspackPlugin()); + } + if (argv.lint) { plugins.push( - new ForkTsCheckerWebpackPlugin({ - typescript: argv.typecheck, - eslint: argv.lint - ? { - files: ".", - } - : undefined, + new ESLintPlugin({ + configType: "flat", + files: ".", + threads: true, }), ); } @@ -141,12 +140,11 @@ async function getWebpackConfig( } async function runWebpack(...args: string[]) { - // @ts-expect-error: no typings available - await webpackCli([ + await new RspackCLI().run([ ...process.argv.slice(0, 2), ...args, "--config", - path.resolve(import.meta.dirname, "webpack", "webpack_config_from_cli.cjs"), + path.resolve(import.meta.dirname, "rspack", "rspack_config_from_cli.js"), ]); } @@ -211,7 +209,7 @@ function parseArgs() { group: "Development server options", type: "number", nargs: 1, - default: 8080, + default: 0, description: "Port number for the development server", }, host: { @@ -253,10 +251,19 @@ function parseArgs() { mode: { default: "production", }, + analyze: { + type: "boolean", + default: false, + description: "Print bundle size analysis.", + }, }), handler: async (argv) => { setConfig(await getWebpackConfig(argv, { watch: argv.watch })); - await runWebpack("build", `--mode=${argv.mode}`); + await runWebpack( + "build", + `--mode=${argv.mode}`, + ...(argv.analyze ? [`--analyze`] : []), + ); }, }) .strict() diff --git a/config/generate-code.ts b/build_tools/generate-code.ts similarity index 84% rename from config/generate-code.ts rename to build_tools/generate-code.ts index b3b2e2c200..37106b61c7 100644 --- a/config/generate-code.ts +++ b/build_tools/generate-code.ts @@ -14,14 +14,11 @@ * limitations under the License. */ -"use strict"; +import fs from "node:fs"; +import path from "node:path"; +import nunjucks from "nunjucks"; -const nunjucks = require("nunjucks"); -const fs = require("fs"); -const path = require("path"); - -const rootDir = path.resolve(__dirname, ".."); -const srcDir = path.resolve(rootDir, "src"); +const rootDir = path.resolve(import.meta.dirname, ".."); const templatesDir = path.resolve(rootDir, "templates"); const env = nunjucks.configure(rootDir, { @@ -34,7 +31,11 @@ const env = nunjucks.configure(rootDir, { }, }); -function writeGenerated(sourcePath, outputPath, contents) { +function writeGenerated( + sourcePath: string, + outputPath: string, + contents: string, +) { fs.writeFileSync( path.resolve(rootDir, "src", outputPath), `// DO NOT EDIT. Generated from templates/${sourcePath}. @@ -42,7 +43,11 @@ function writeGenerated(sourcePath, outputPath, contents) { ); } -function renderTemplate(sourcePath, outputPath, context) { +function renderTemplate( + sourcePath: string, + outputPath: string, + context: Record, +) { writeGenerated( sourcePath, outputPath, @@ -58,7 +63,7 @@ function writeSegmentationCompression() { {}, ); for (const dataType of ["uint64", "uint32"]) { - const context = { + const context: Record = { dataType, strideMultiplier: dataType === "uint64" ? 2 : 1, }; @@ -72,7 +77,11 @@ function writeSegmentationCompression() { } } -function makeSubstitutions(inputPath, outputPath, replacements) { +function makeSubstitutions( + inputPath: string, + outputPath: string, + replacements: [string | RegExp, string][], +) { let inputContents = fs.readFileSync(path.resolve(templatesDir, inputPath), { encoding: "utf-8", }); @@ -107,7 +116,7 @@ function writeDataStructures() { const nextPrevReplacements = [ [/NEXT_PROPERTY/g, `next${i}`], [/PREV_PROPERTY/g, `prev${i}`], - ]; + ] as [string | RegExp, string][]; makeSubstitutions( path.join(baseDir, "linked_list.template.ts"), path.join(baseDir, `linked_list.${i}.ts`), diff --git a/build_tools/webpack/configuration_with_define.js b/build_tools/rspack/configuration_with_define.js similarity index 51% rename from build_tools/webpack/configuration_with_define.js rename to build_tools/rspack/configuration_with_define.js index 602ac51425..81dfff9aaf 100644 --- a/build_tools/webpack/configuration_with_define.js +++ b/build_tools/rspack/configuration_with_define.js @@ -1,13 +1,13 @@ -// Converts a webpack configuration that optionally contains an extra `define` -// property into a regular webpack configuration with an added `DefinePlugin`. +// Converts an rspack configuration that optionally contains an extra `define` +// property into a regular rspack configuration with an added `DefinePlugin`. -import webpack from "webpack"; +import { DefinePlugin } from "@rspack/core"; export function normalizeConfigurationWithDefine(config) { let { define, plugins, ...rest } = config; if (define !== undefined && Object.keys(define).length > 0) { plugins ??= []; - plugins.push(new webpack.DefinePlugin(define)); + plugins.push(new DefinePlugin(define)); } return { plugins, ...rest }; } diff --git a/build_tools/rspack/rspack_config_from_cli.js b/build_tools/rspack/rspack_config_from_cli.js new file mode 100644 index 0000000000..4ef6bd67d1 --- /dev/null +++ b/build_tools/rspack/rspack_config_from_cli.js @@ -0,0 +1,12 @@ +// This module is specified as the rspack config module when `cli.ts` invokes +// `@rspack/cli` programmatically. +// +// It simply returns the configuration previously set by `cli.ts`. + +let config = undefined; + +export function setConfig(newConfig) { + config = newConfig; +} + +export default (...args) => config(...args); diff --git a/build_tools/update-conditions.ts b/build_tools/update-conditions.ts index 873829e161..f5406566f6 100644 --- a/build_tools/update-conditions.ts +++ b/build_tools/update-conditions.ts @@ -15,72 +15,107 @@ const NOOP = "./src/util/false" + JS_EXT; const imports: Record = {}; imports["#src/third_party/jpgjs/jpg.js"] = "./src/third_party/jpgjs/jpg.js"; +imports["#src/async_computation/decode_zstd.js"] = { + node: "./src/async_computation/decode_zstd_node.ts", + default: "./src/async_computation/decode_zstd.ts", +}; imports["#src/*.js"] = "./src/*.ts"; imports["#src/*"] = "./src/*"; +imports["#tests/fixtures/msw"] = { + node: "./tests/fixtures/msw_node.ts", + default: "./tests/fixtures/msw_browser.ts", +}; +imports["#tests/fixtures/gl"] = { + node: "./tests/fixtures/gl_node.ts", + default: "./tests/fixtures/gl_browser.ts", +}; +imports["#tests/*.js"] = "./tests/*.ts"; imports["#testdata/*"] = "./testdata/*"; -const datasourceDir = path.resolve(rootDir, "src", "datasource"); -const layerDir = path.resolve(rootDir, "src", "layer"); - -const datasources = ( - await fs.promises.readdir(datasourceDir, { withFileTypes: true }) -) - .filter((e) => e.isDirectory()) - .map((e) => e.name); - -const layers = (await fs.promises.readdir(layerDir, { withFileTypes: true })) - .filter((e) => e.isDirectory()) - .map((e) => e.name); - -const datasourceKeys = { - backend: "backend", - async_computation: "async_computation", - register_default: "frontend", - register_credentials_provider: "frontend", -} as const; +async function listSubdirs(dir: string): Promise { + return (await fs.promises.readdir(dir, { withFileTypes: true })) + .filter((e) => e.isDirectory()) + .map((e) => e.name); +} -const datasourceModules = Object.fromEntries( - Object.values(datasourceKeys).map((key) => [key, new Array()]), -); +async function writeModule(modulePath: string, imports: string[]) { + await fs.promises.writeFile( + modulePath, + "// DO NOT EDIT: Generated by config/update_conditions.ts\n" + + imports.map((name) => `import ${JSON.stringify(name)};\n`).join(""), + { encoding: "utf-8" }, + ); +} -for (const datasource of datasources) { - for (const [filePrefix, moduleKind] of Object.entries(datasourceKeys)) { - const sourcePrefix = `./src/datasource/${datasource}/${filePrefix}`; - if ( - await fs.promises - .stat(path.resolve(rootDir, `${sourcePrefix}.ts`)) - .catch(() => undefined) - ) { - const source = sourcePrefix + JS_EXT; - const conditions: Record = {}; - if (datasource === "python") { - conditions["neuroglancer/python"] = source; - conditions.default = NOOP; - } else { - if (filePrefix === "register_credentials_provider") { - conditions["neuroglancer/python"] = NOOP; +async function handleDrivers( + kind: string, + moduleMap: Record, +) { + const driverDir = path.resolve(rootDir, "src", kind); + const drivers = await listSubdirs(driverDir); + const modules: Record = {}; + for (const driver of drivers) { + for (const [filePrefix, moduleKinds] of Object.entries(moduleMap)) { + const sourcePrefix = `./src/${kind}/${driver}/${filePrefix}`; + if ( + await fs.promises + .stat(path.resolve(rootDir, `${sourcePrefix}.ts`)) + .catch(() => undefined) + ) { + const source = sourcePrefix + JS_EXT; + const conditions: Record = {}; + if (driver === "python") { + conditions["neuroglancer/python"] = source; + conditions.default = NOOP; + } else { + if (filePrefix === "register_credentials_provider") { + conditions["neuroglancer/python"] = NOOP; + } + conditions[`neuroglancer/${kind}/${driver}:enabled`] = source; + conditions[`neuroglancer/${kind}:none_by_default`] = NOOP; + conditions[`neuroglancer/${kind}/${driver}:disabled`] = NOOP; + conditions.default = source; + } + let moduleId = `#${kind}/${driver}`; + if (filePrefix !== "index") { + moduleId += `/${filePrefix}`; + } + imports[moduleId] = conditions; + for (const moduleKind of moduleKinds) { + if (modules[moduleKind] === undefined) { + modules[moduleKind] = []; + } + modules[moduleKind].push(moduleId); } - conditions[`neuroglancer/datasource/${datasource}:enabled`] = source; - conditions["neuroglancer/datasource:none_by_default"] = NOOP; - conditions[`neuroglancer/datasource/${datasource}:disabled`] = source; - conditions.default = source; } - const moduleId = `#datasource/${datasource}/${filePrefix}`; - imports[moduleId] = conditions; - datasourceModules[moduleKind].push(moduleId); } } + for (const [moduleKind, moduleIds] of Object.entries(modules)) { + await writeModule( + path.resolve(driverDir, `enabled_${moduleKind}_modules.ts`), + moduleIds, + ); + } } -for (const layer of layers) { - const source = `./src/layer/${layer}/index` + JS_EXT; - imports[`#layer/${layer}`] = { - [`neuroglancer/layer/${layer}:enabled`]: source, - "neuroglancer/layer:none_by_default": NOOP, - [`neuroglancer/layer/${layer}:enabled`]: source, - default: source, - }; -} +await handleDrivers("datasource", { + backend: ["backend"], + async_computation: ["async_computation"], + register_default: ["frontend"], + register_credentials_provider: ["frontend"], +}); + +await handleDrivers("kvstore", { + async_computation: ["async_computation"], + register: ["frontend", "backend"], + register_frontend: ["frontend"], + register_backend: ["backend"], + register_credentials_provider: ["frontend"], +}); + +await handleDrivers("layer", { + index: ["frontend"], +}); // main entrypoint. imports["#main"] = { @@ -94,32 +129,6 @@ imports["#python_integration_build"] = { default: NOOP, }; -async function writeModule(modulePath: string, imports: string[]) { - await fs.promises.writeFile( - modulePath, - "// DO NOT EDIT: Generated by config/update_conditions.ts\n" + - imports.map((name) => `import ${JSON.stringify(name)};\n`).join(""), - { encoding: "utf-8" }, - ); -} - -for (const [moduleKind, moduleIds] of Object.entries(datasourceModules)) { - await writeModule( - path.resolve( - rootDir, - "src", - "datasource", - `enabled_${moduleKind}_modules.ts`, - ), - moduleIds, - ); -} - -await writeModule( - path.resolve(rootDir, "src", "layer", "enabled_frontend_modules.ts"), - layers.map((name) => `#layer/${name}`), -); - packageJson.imports = imports; packageJson.exports = { diff --git a/build_tools/update-example-dependencies.ts b/build_tools/update-example-dependencies.ts index 1a6ec5d7e0..4d74b4aad9 100644 --- a/build_tools/update-example-dependencies.ts +++ b/build_tools/update-example-dependencies.ts @@ -23,7 +23,7 @@ await Promise.all( await execFileAsync("npx", ["npm-check-updates", "-u"], { cwd: exampleDir, }); - await execFileAsync("npm", ["install", "--no-audit", "--no-fund"], { + await execFileAsync("pnpm", ["install"], { cwd: exampleDir, }); }), diff --git a/build_tools/vitest/build_fake_gcs_server.ts b/build_tools/vitest/build_fake_gcs_server.ts new file mode 100644 index 0000000000..2009ba7365 --- /dev/null +++ b/build_tools/vitest/build_fake_gcs_server.ts @@ -0,0 +1,57 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawnSync } from "node:child_process"; +import fs from "node:fs/promises"; +import path from "node:path"; + +export async function getFakeGcsServerBin(): Promise { + const binDir = path.join( + import.meta.dirname, + "..", + "..", + "node_modules", + ".cache", + "gobin", + ); + const serverBinPath = + path.join(binDir, "fake-gcs-server") + + (process.platform === "win32" ? ".exe" : ""); + if ( + !(await fs.access(serverBinPath).then( + () => true, + () => false, + )) + ) { + console.log("Building fake-gcs-server"); + // Note: For unknown reasons, using `await promisify(spawn)` in place of + // `spawnSync` causes the vitest process to exit as soon as the child + // process completes. + spawnSync( + "go", + [ + "install", + "github.com/fsouza/fake-gcs-server@3b3d059cbaade55b480196a51dedb7aa82ec2b0a", + ], + { + env: { ...process.env, GOBIN: binDir }, + stdio: ["ignore", "inherit", "inherit"], + }, + ); + console.log("Done building fake-gcs-server"); + } + return serverBinPath; +} diff --git a/build_tools/vitest/fake_ngauth_server.ts b/build_tools/vitest/fake_ngauth_server.ts new file mode 100644 index 0000000000..ed0068b333 --- /dev/null +++ b/build_tools/vitest/fake_ngauth_server.ts @@ -0,0 +1,98 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Fake ngauth server used for tests. + +import type { AddressInfo } from "node:net"; +import cookie from "cookie"; +import express from "express"; + +const COOKIE_NAME = "ngauth_login"; +const COOKIE_VALUE = "fake_login"; +const TOKEN_VALUE = "fake_token"; + +export interface FakeNgauthServer extends AsyncDisposable { + url: string; +} + +export function startFakeNgauthServer(): Promise { + const app = express(); + app.use(express.json({ inflate: false, type: "*/*" })); + app.get("/login", (req, res) => { + const origin = (req.query.origin ?? "").toString(); + res.contentType("text/html"); + // Note: The real ngauth marks this cookie as http-only, but that prevents + // JavaScript from clearing it. + res.cookie(COOKIE_NAME, COOKIE_VALUE, { sameSite: "lax" }); + const jsonToken = JSON.stringify({ token: TOKEN_VALUE }); + const jsonOrigin = JSON.stringify(origin); + res.send(` + + + + + +`); + }); + app.post("/token", (req, res) => { + const cookies = cookie.parse(req.headers.cookie ?? ""); + const origin = req.headers.origin ?? ""; + res.set("x-frame-options", "deny"); + res.set("access-control-allow-origin", origin); + res.set("access-control-allow-credentials", "true"); + res.set("vary", "origin"); + + if (cookies[COOKIE_NAME] === COOKIE_VALUE) { + res.contentType("text/plain"); + res.send(TOKEN_VALUE); + } else { + res.status(401); + res.send(); + } + }); + app.post("/gcs_token", (req, res) => { + const origin = req.headers.origin ?? ""; + res.set("access-control-allow-origin", origin); + res.set("vary", "origin"); + const { body } = req; + if ( + typeof body !== "object" || + Array.isArray(body) || + body.token !== TOKEN_VALUE + ) { + res.status(400); + res.send(); + } else { + res.json({ token: "fake_gcs_token:" + body.bucket }); + } + }); + const server = app.listen(0, "localhost"); + // Don't block node from exiting while this server is running. + server.unref(); + return new Promise((resolve, reject) => { + server.on("error", reject); + server.on("listening", () => { + const port = (server.address() as AddressInfo).port; + resolve({ + url: `http://localhost:${port}`, + [Symbol.asyncDispose]: () => + new Promise((resolve) => server.close(() => resolve())), + }); + }); + }); +} diff --git a/build_tools/vitest/polyfill-browser-globals-in-node.ts b/build_tools/vitest/polyfill-browser-globals-in-node.ts new file mode 100644 index 0000000000..c4d2ce3452 --- /dev/null +++ b/build_tools/vitest/polyfill-browser-globals-in-node.ts @@ -0,0 +1,16 @@ +import { webcrypto } from "node:crypto"; +import type { JSDOM } from "jsdom"; + +declare let jsdom: JSDOM; + +Object.defineProperty(globalThis, "crypto", { + value: webcrypto, +}); + +for (const name of [ + /*"DOMParser", "XPathResult", "navigator"*/ +] as const) { + Object.defineProperty(globalThis, name, { + value: jsdom.window[name], + }); +} diff --git a/build_tools/vitest/python_tools.ts b/build_tools/vitest/python_tools.ts new file mode 100644 index 0000000000..d05f658579 --- /dev/null +++ b/build_tools/vitest/python_tools.ts @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawnSync } from "node:child_process"; +import path from "node:path"; + +export const PYTHON_TEST_TOOLS_PATH = path.join( + import.meta.dirname, + "python_tools", +); + +export async function syncPythonTools() { + // Note: For unknown reasons, using `await promisify(spawn)` in place of + // `spawnSync` causes the vitest process to exit as soon as the child + // process completes. + spawnSync("uv", ["sync", "--project", PYTHON_TEST_TOOLS_PATH], { + stdio: ["ignore", "inherit", "inherit"], + }); +} diff --git a/build_tools/vitest/python_tools/pyproject.toml b/build_tools/vitest/python_tools/pyproject.toml new file mode 100644 index 0000000000..1856805f59 --- /dev/null +++ b/build_tools/vitest/python_tools/pyproject.toml @@ -0,0 +1,8 @@ +[project] +name = "python-tools" +description = "Python tools used by the test suite" +version = "0.0" +requires-python = ">=3.11" +dependencies = [ + "moto[s3,server]>=5.0.28", +] diff --git a/build_tools/vitest/python_tools/uv.lock b/build_tools/vitest/python_tools/uv.lock new file mode 100644 index 0000000000..fd52cb2d8c --- /dev/null +++ b/build_tools/vitest/python_tools/uv.lock @@ -0,0 +1,1091 @@ +version = 1 +requires-python = ">=3.11" + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "antlr4-python3-runtime" +version = "4.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/5f/2cdf6f7aca3b20d3f316e9f505292e1f256a32089bd702034c29ebde6242/antlr4_python3_runtime-4.13.2.tar.gz", hash = "sha256:909b647e1d2fc2b70180ac586df3933e38919c85f98ccc656a96cd3f25ef3916", size = 117467 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/03/a851e84fcbb85214dc637b6378121ef9a0dd61b4c65264675d8a5c9b1ae7/antlr4_python3_runtime-4.13.2-py3-none-any.whl", hash = "sha256:fe3835eb8d33daece0e799090eda89719dbccee7aa39ef94eed3818cafa5a7e8", size = 144462 }, +] + +[[package]] +name = "attrs" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/7c/fdf464bcc51d23881d110abd74b512a42b3d5d376a55a831b44c603ae17f/attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e", size = 810562 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a", size = 63152 }, +] + +[[package]] +name = "aws-sam-translator" +version = "1.94.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/2c/69276246bc22293aec595dac217e0ad8299053d05c8ff00a24d1f09395b3/aws_sam_translator-1.94.0.tar.gz", hash = "sha256:8ec258d9f7ece72ef91c81f4edb45a2db064c16844b6afac90c575893beaa391", size = 326072 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/84/f3ce5384246c86f3806ca7b8b009edb9ea58271fd222c0bd69e31191b75c/aws_sam_translator-1.94.0-py3-none-any.whl", hash = "sha256:100e33eeffcfa81f7c45cadeb0ee29596ce829f6b4d2745140f04fa19a41f539", size = 384395 }, +] + +[[package]] +name = "aws-xray-sdk" +version = "2.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/6c/8e7fb2a45f20afc5c19d52807b560793fb48b0feca1de7de116b62a7893e/aws_xray_sdk-2.14.0.tar.gz", hash = "sha256:aab843c331af9ab9ba5cefb3a303832a19db186140894a523edafc024cc0493c", size = 93976 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/69/b417833a8926fa5491e5346d7c233bf7d8a9b12ba1f4ef41ccea2494000c/aws_xray_sdk-2.14.0-py2.py3-none-any.whl", hash = "sha256:cfbe6feea3d26613a2a869d14c9246a844285c97087ad8f296f901633554ad94", size = 101922 }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, +] + +[[package]] +name = "boto3" +version = "1.36.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/2b/7365aab02b6768a9694ff43e0e5f1f83f205fc7fe253a410cda990425048/boto3-1.36.12.tar.gz", hash = "sha256:287d84f49bba3255a17b374578127d42b6251e72f55914a62e0ad9ca78c0954b", size = 111048 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/0b/eb4d244ea84b0fd9e255286a30c98f37f8f28bbf6ea85f7f4b734bf929a9/boto3-1.36.12-py3-none-any.whl", hash = "sha256:32cdf0967287f3ec25a9dc09df0d29cb86b8900c3e0546a63d672775d8127abf", size = 139178 }, +] + +[[package]] +name = "botocore" +version = "1.36.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/54/cc9a665f92534aa105a49dd867f18d4eff4687835994a70a32a103fa11ae/botocore-1.36.12.tar.gz", hash = "sha256:86ed88beb4f244c96529435c868d3940073c2774116f0023fb7691f6e7053bd9", size = 13498321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/3a/5e19d1d1896e86bb9c25f31f5f05ff2e8f40727aa66ee6149b545d3e28b0/botocore-1.36.12-py3-none-any.whl", hash = "sha256:5ae1ed362c8ed908a6ced8cdd12b21e2196c100bc79f9e95c9c1fc7f9ea74f5a", size = 13328293 }, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "cfn-lint" +version = "1.23.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aws-sam-translator" }, + { name = "jsonpatch" }, + { name = "networkx" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "sympy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/d8/540237f883335bc194082a551627e8da59f2d1edd90c17a44adfb1b7c335/cfn_lint-1.23.1.tar.gz", hash = "sha256:2ee8722673414a3993921d87cc1893934d313b9b953da7a91442f81958d86644", size = 2789263 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/55/20016cf90e9571b70af710288329b18099567da80efe0e2074676176713f/cfn_lint-1.23.1-py3-none-any.whl", hash = "sha256:6f89f557dea6484cd5bc1b32cef91e9898dd1d98f12d5b59a7f6baf9cf61b7ee", size = 4802727 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "platform_system == 'Windows'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "cryptography" +version = "44.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/4c/45dfa6829acffa344e3967d6006ee4ae8be57af746ae2eba1c431949b32c/cryptography-44.0.0.tar.gz", hash = "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02", size = 710657 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/55/09/8cc67f9b84730ad330b3b72cf867150744bf07ff113cda21a15a1c6d2c7c/cryptography-44.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123", size = 6541833 }, + { url = "https://files.pythonhosted.org/packages/7e/5b/3759e30a103144e29632e7cb72aec28cedc79e514b2ea8896bb17163c19b/cryptography-44.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092", size = 3922710 }, + { url = "https://files.pythonhosted.org/packages/5f/58/3b14bf39f1a0cfd679e753e8647ada56cddbf5acebffe7db90e184c76168/cryptography-44.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f", size = 4137546 }, + { url = "https://files.pythonhosted.org/packages/98/65/13d9e76ca19b0ba5603d71ac8424b5694415b348e719db277b5edc985ff5/cryptography-44.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb", size = 3915420 }, + { url = "https://files.pythonhosted.org/packages/b1/07/40fe09ce96b91fc9276a9ad272832ead0fddedcba87f1190372af8e3039c/cryptography-44.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b", size = 4154498 }, + { url = "https://files.pythonhosted.org/packages/75/ea/af65619c800ec0a7e4034207aec543acdf248d9bffba0533342d1bd435e1/cryptography-44.0.0-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543", size = 3932569 }, + { url = "https://files.pythonhosted.org/packages/c7/af/d1deb0c04d59612e3d5e54203159e284d3e7a6921e565bb0eeb6269bdd8a/cryptography-44.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e", size = 4016721 }, + { url = "https://files.pythonhosted.org/packages/bd/69/7ca326c55698d0688db867795134bdfac87136b80ef373aaa42b225d6dd5/cryptography-44.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e", size = 4240915 }, + { url = "https://files.pythonhosted.org/packages/ef/d4/cae11bf68c0f981e0413906c6dd03ae7fa864347ed5fac40021df1ef467c/cryptography-44.0.0-cp37-abi3-win32.whl", hash = "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053", size = 2757925 }, + { url = "https://files.pythonhosted.org/packages/64/b1/50d7739254d2002acae64eed4fc43b24ac0cc44bf0a0d388d1ca06ec5bb1/cryptography-44.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd", size = 3202055 }, + { url = "https://files.pythonhosted.org/packages/11/18/61e52a3d28fc1514a43b0ac291177acd1b4de00e9301aaf7ef867076ff8a/cryptography-44.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591", size = 6542801 }, + { url = "https://files.pythonhosted.org/packages/1a/07/5f165b6c65696ef75601b781a280fc3b33f1e0cd6aa5a92d9fb96c410e97/cryptography-44.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7", size = 3922613 }, + { url = "https://files.pythonhosted.org/packages/28/34/6b3ac1d80fc174812486561cf25194338151780f27e438526f9c64e16869/cryptography-44.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc", size = 4137925 }, + { url = "https://files.pythonhosted.org/packages/d0/c7/c656eb08fd22255d21bc3129625ed9cd5ee305f33752ef2278711b3fa98b/cryptography-44.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289", size = 3915417 }, + { url = "https://files.pythonhosted.org/packages/ef/82/72403624f197af0db6bac4e58153bc9ac0e6020e57234115db9596eee85d/cryptography-44.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7", size = 4155160 }, + { url = "https://files.pythonhosted.org/packages/a2/cd/2f3c440913d4329ade49b146d74f2e9766422e1732613f57097fea61f344/cryptography-44.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c", size = 3932331 }, + { url = "https://files.pythonhosted.org/packages/7f/df/8be88797f0a1cca6e255189a57bb49237402b1880d6e8721690c5603ac23/cryptography-44.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64", size = 4017372 }, + { url = "https://files.pythonhosted.org/packages/af/36/5ccc376f025a834e72b8e52e18746b927f34e4520487098e283a719c205e/cryptography-44.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285", size = 4239657 }, + { url = "https://files.pythonhosted.org/packages/46/b0/f4f7d0d0bcfbc8dd6296c1449be326d04217c57afb8b2594f017eed95533/cryptography-44.0.0-cp39-abi3-win32.whl", hash = "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417", size = 2758672 }, + { url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede", size = 3202071 }, +] + +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774 }, +] + +[[package]] +name = "flask" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blinker" }, + { name = "click" }, + { name = "itsdangerous" }, + { name = "jinja2" }, + { name = "werkzeug" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/50/dff6380f1c7f84135484e176e0cac8690af72fa90e932ad2a0a60e28c69b/flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", size = 680824 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136", size = 102979 }, +] + +[[package]] +name = "flask-cors" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flask" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4f/d0/d9e52b154e603b0faccc0b7c2ad36a764d8755ef4036acbf1582a67fb86b/flask_cors-5.0.0.tar.gz", hash = "sha256:5aadb4b950c4e93745034594d9f3ea6591f734bb3662e16e255ffbf5e89c88ef", size = 30954 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/07/1afa0514c876282bebc1c9aee83c6bb98fe6415cf57b88d9b06e7e29bf9c/Flask_Cors-5.0.0-py2.py3-none-any.whl", hash = "sha256:b9e307d082a9261c100d8fb0ba909eec6a228ed1b60a8315fd85f783d61910bc", size = 14463 }, +] + +[[package]] +name = "graphql-core" +version = "3.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/16/7574029da84834349b60ed71614d66ca3afe46e9bf9c7b9562102acb7d4f/graphql_core-3.2.6.tar.gz", hash = "sha256:c08eec22f9e40f0bd61d805907e3b3b1b9a320bc606e23dc145eebca07c8fbab", size = 505353 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl", hash = "sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f", size = 203416 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "jmespath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, +] + +[[package]] +name = "joserfc" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/73/06a394569ecdb6decdee8cd2a916f2391730f269225b7c2416a2a806e270/joserfc-1.0.2.tar.gz", hash = "sha256:f3c4efa35a62fc100097e4bec2584f5fd21b878eee3eb5324bc9b37d2969b2a4", size = 170521 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/01/adc0fd12a64413fced1b5c85fa7af8e12b32430ccc736b43e3d29c52f714/joserfc-1.0.2-py3-none-any.whl", hash = "sha256:8d3e0253b0b24aeaf049d7bf7a847040dd6462de24cefd0c14abfc8b353f9619", size = 60931 }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898 }, +] + +[[package]] +name = "jsonpath-ng" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ply" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/86/08646239a313f895186ff0a4573452038eed8c86f54380b3ebac34d32fb2/jsonpath-ng-1.7.0.tar.gz", hash = "sha256:f6f5f7fd4e5ff79c785f1573b394043b39849fb2bb47bcead935d12b00beab3c", size = 37838 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/5a/73ecb3d82f8615f32ccdadeb9356726d6cae3a4bbc840b437ceb95708063/jsonpath_ng-1.7.0-py3-none-any.whl", hash = "sha256:f3d7f9e848cba1b6da28c55b1c26ff915dc9e0b1ba7e752a53d6da8d5cbd00b6", size = 30105 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[[package]] +name = "jsonschema-path" +version = "0.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/45/41ebc679c2a4fced6a722f624c18d658dee42612b83ea24c1caf7c0eb3a8/jsonschema_path-0.3.4.tar.gz", hash = "sha256:8365356039f16cc65fddffafda5f58766e34bebab7d6d105616ab52bc4297001", size = 11159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/58/3485da8cb93d2f393bce453adeef16896751f14ba3e2024bc21dc9597646/jsonschema_path-0.3.4-py3-none-any.whl", hash = "sha256:f502191fdc2b22050f9a81c9237be9d27145b9001c55842bece5e94e382e52f8", size = 14810 }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, +] + +[[package]] +name = "lazy-object-proxy" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/f0/f02e2d150d581a294efded4020094a371bbab42423fe78625ac18854d89b/lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69", size = 43271 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/e1/99a7ec68b892c9b8c6212617f54e7e9b0304d47edad8c0ff043ae3aeb1a9/lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c", size = 27434 }, + { url = "https://files.pythonhosted.org/packages/1a/76/6a41de4b44d1dcfe4c720d4606de0d7b69b6b450f0bdce16f2e1fb8abc89/lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4", size = 70687 }, + { url = "https://files.pythonhosted.org/packages/1e/5d/eaa12126e8989c9bdd21d864cbba2b258cb9ee2f574ada1462a0004cfad8/lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56", size = 69757 }, + { url = "https://files.pythonhosted.org/packages/53/a9/6f22cfe9572929656988b72c0de266c5d10755369b575322725f67364c4e/lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9", size = 73709 }, + { url = "https://files.pythonhosted.org/packages/bd/e6/b10fd94710a99a6309f3ad61a4eb480944bbb17fcb41bd2d852fdbee57ee/lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f", size = 73191 }, + { url = "https://files.pythonhosted.org/packages/c9/78/a9b9d314da02fe66b632f2354e20e40fc3508befb450b5a17987a222b383/lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03", size = 25773 }, + { url = "https://files.pythonhosted.org/packages/94/e6/e2d3b0c9efe61f72dc327ce2355941f540e0b0d1f2b3490cbab6bab7d3ea/lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6", size = 27550 }, + { url = "https://files.pythonhosted.org/packages/d0/5d/768a7f2ccebb29604def61842fd54f6f5f75c79e366ee8748dda84de0b13/lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba", size = 27560 }, + { url = "https://files.pythonhosted.org/packages/b3/ce/f369815549dbfa4bebed541fa4e1561d69e4f268a1f6f77da886df182dab/lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43", size = 72403 }, + { url = "https://files.pythonhosted.org/packages/44/46/3771e0a4315044aa7b67da892b2fb1f59dfcf0eaff2c8967b2a0a85d5896/lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9", size = 72401 }, + { url = "https://files.pythonhosted.org/packages/81/39/84ce4740718e1c700bd04d3457ac92b2e9ce76529911583e7a2bf4d96eb2/lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3", size = 75375 }, + { url = "https://files.pythonhosted.org/packages/86/3b/d6b65da2b864822324745c0a73fe7fd86c67ccea54173682c3081d7adea8/lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b", size = 75466 }, + { url = "https://files.pythonhosted.org/packages/f5/33/467a093bf004a70022cb410c590d937134bba2faa17bf9dc42a48f49af35/lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074", size = 25914 }, + { url = "https://files.pythonhosted.org/packages/77/ce/7956dc5ac2f8b62291b798c8363c81810e22a9effe469629d297d087e350/lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282", size = 27525 }, + { url = "https://files.pythonhosted.org/packages/31/8b/94dc8d58704ab87b39faed6f2fc0090b9d90e2e2aa2bbec35c79f3d2a054/lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d", size = 16405 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "moto" +version = "5.0.28" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boto3" }, + { name = "botocore" }, + { name = "cryptography" }, + { name = "jinja2" }, + { name = "python-dateutil" }, + { name = "requests" }, + { name = "responses" }, + { name = "werkzeug" }, + { name = "xmltodict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/80/ac29b291289e16d0cb047dcce8a555ab150bcd30328141efff207f26ab7c/moto-5.0.28.tar.gz", hash = "sha256:4d3437693411ec943c13c77de5b0b520c4b0a9ac850fead4ba2a54709e086e8b", size = 6537950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/d1/5a472eb11de9ee395db53c29cbd7b16a6c4d3e0d802b13d94a73951c2eae/moto-5.0.28-py3-none-any.whl", hash = "sha256:2dfbea1afe3b593e13192059a1a7fc4b3cf7fdf92e432070c22346efa45aa0f0", size = 4696467 }, +] + +[package.optional-dependencies] +s3 = [ + { name = "py-partiql-parser" }, + { name = "pyyaml" }, +] +server = [ + { name = "antlr4-python3-runtime" }, + { name = "aws-xray-sdk" }, + { name = "cfn-lint" }, + { name = "docker" }, + { name = "flask" }, + { name = "flask-cors" }, + { name = "graphql-core" }, + { name = "joserfc" }, + { name = "jsonpath-ng" }, + { name = "openapi-spec-validator" }, + { name = "py-partiql-parser" }, + { name = "pyparsing" }, + { name = "pyyaml" }, + { name = "setuptools" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, +] + +[[package]] +name = "openapi-schema-validator" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-specifications" }, + { name = "rfc3339-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/f3/5507ad3325169347cd8ced61c232ff3df70e2b250c49f0fe140edb4973c6/openapi_schema_validator-0.6.3.tar.gz", hash = "sha256:f37bace4fc2a5d96692f4f8b31dc0f8d7400fd04f3a937798eaf880d425de6ee", size = 11550 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/c6/ad0fba32775ae749016829dace42ed80f4407b171da41313d1a3a5f102e4/openapi_schema_validator-0.6.3-py3-none-any.whl", hash = "sha256:f3b9870f4e556b5a62a1c39da72a6b4b16f3ad9c73dc80084b1b11e74ba148a3", size = 8755 }, +] + +[[package]] +name = "openapi-spec-validator" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "jsonschema-path" }, + { name = "lazy-object-proxy" }, + { name = "openapi-schema-validator" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/fe/21954ff978239dc29ebb313f5c87eeb4ec929b694b9667323086730998e2/openapi_spec_validator-0.7.1.tar.gz", hash = "sha256:8577b85a8268685da6f8aa30990b83b7960d4d1117e901d451b5d572605e5ec7", size = 37985 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2b/4d/e744fff95aaf3aeafc968d5ba7297c8cda0d1ecb8e3acd21b25adae4d835/openapi_spec_validator-0.7.1-py3-none-any.whl", hash = "sha256:3c81825043f24ccbcd2f4b149b11e8231abce5ba84f37065e14ec947d8f4e959", size = 38998 }, +] + +[[package]] +name = "pathable" +version = "0.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/93/8f2c2075b180c12c1e9f6a09d1a985bc2036906b13dff1d8917e395f2048/pathable-0.4.4.tar.gz", hash = "sha256:6905a3cd17804edfac7875b5f6c9142a218c7caef78693c2dbbbfbac186d88b2", size = 8124 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592 }, +] + +[[package]] +name = "ply" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e5/69/882ee5c9d017149285cab114ebeab373308ef0f874fcdac9beb90e0ac4da/ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3", size = 159130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce", size = 49567 }, +] + +[[package]] +name = "py-partiql-parser" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/58/a1/0a2867e48b232b4f82c4929ef7135f2a5d72c3886b957dccf63c70aa2fcb/py_partiql_parser-0.6.1.tar.gz", hash = "sha256:8583ff2a0e15560ef3bc3df109a7714d17f87d81d33e8c38b7fed4e58a63215d", size = 17120 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/84/0e410c20bbe9a504fc56e97908f13261c2b313d16cbb3b738556166f044a/py_partiql_parser-0.6.1-py2.py3-none-any.whl", hash = "sha256:ff6a48067bff23c37e9044021bf1d949c83e195490c17e020715e927fe5b2456", size = 23520 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-tools" +version = "0.0" +source = { virtual = "." } +dependencies = [ + { name = "moto", extra = ["s3", "server"] }, +] + +[package.metadata] +requires-dist = [{ name = "moto", extras = ["s3", "server"], specifier = ">=5.0.28" }] + +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, + { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, + { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "referencing" +version = "0.36.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "responses" +version = "0.25.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/63/759996eea0f17e8dc4c9ea9c60765292d28a7750bdbee073ad55d83caa57/responses-0.25.6.tar.gz", hash = "sha256:eae7ce61a9603004e76c05691e7c389e59652d91e94b419623c12bbfb8e331d8", size = 79145 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/c4/8d23584b3a3471ea6f5a18cfb035e11eeb9fa9b3112d901477c6ad10cc4e/responses-0.25.6-py3-none-any.whl", hash = "sha256:9cac8f21e1193bb150ec557875377e41ed56248aed94e4567ed644db564bacf1", size = 34730 }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, + { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, + { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, + { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 }, + { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 }, + { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 }, + { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 }, + { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 }, + { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 }, + { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 }, + { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 }, + { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 }, + { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 }, + { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 }, + { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 }, + { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 }, + { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 }, + { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 }, + { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 }, + { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 }, + { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 }, + { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 }, + { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 }, + { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 }, + { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 }, + { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 }, + { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 }, + { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 }, + { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 }, + { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 }, + { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 }, + { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 }, + { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 }, + { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 }, + { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 }, + { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 }, + { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 }, + { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 }, + { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 }, + { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 }, + { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 }, + { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 }, + { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 }, + { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 }, + { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 }, + { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 }, + { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 }, + { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 }, + { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 }, + { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, + { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, + { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, +] + +[[package]] +name = "s3transfer" +version = "0.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/45/2323b5928f86fd29f9afdcef4659f68fa73eaa5356912b774227f5cf46b5/s3transfer-0.11.2.tar.gz", hash = "sha256:3b39185cb72f5acc77db1a58b6e25b977f28d20496b6e58d6813d75f464d632f", size = 147885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/ac/e7dc469e49048dc57f62e0c555d2ee3117fa30813d2a1a2962cce3a2a82a/s3transfer-0.11.2-py3-none-any.whl", hash = "sha256:be6ecb39fadd986ef1701097771f87e4d2f821f27f6071c872143884d2950fbc", size = 84151 }, +] + +[[package]] +name = "setuptools" +version = "75.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ec/089608b791d210aec4e7f97488e67ab0d33add3efccb83a056cbafe3a2a6/setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6", size = 1343222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/8a/b9dc7678803429e4a3bc9ba462fa3dd9066824d3c607490235c6a796be5a/setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3", size = 1228782 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sympy" +version = "1.13.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/8a/5a7fd6284fa8caac23a26c9ddf9c30485a48169344b4bd3b0f02fef1890f/sympy-1.13.3.tar.gz", hash = "sha256:b27fd2c6530e0ab39e275fc9b683895367e51d5da91baa8d3d64db2565fec4d9", size = 7533196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/ff/c87e0622b1dadea79d2fb0b25ade9ed98954c9033722eb707053d310d4f3/sympy-1.13.3-py3-none-any.whl", hash = "sha256:54612cf55a62755ee71824ce692986f23c88ffa77207b30c1368eda4a7060f73", size = 6189483 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "werkzeug" +version = "3.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/69/83029f1f6300c5fb2471d621ab06f6ec6b3324685a2ce0f9777fd4a8b71e/werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746", size = 806925 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", size = 224498 }, +] + +[[package]] +name = "wrapt" +version = "1.17.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +] + +[[package]] +name = "xmltodict" +version = "0.14.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/05/51dcca9a9bf5e1bce52582683ce50980bcadbc4fa5143b9f2b19ab99958f/xmltodict-0.14.2.tar.gz", hash = "sha256:201e7c28bb210e374999d1dde6382923ab0ed1a8a5faeece48ab525b7810a553", size = 51942 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/45/fc303eb433e8a2a271739c98e953728422fa61a3c1f36077a49e395c972e/xmltodict-0.14.2-py2.py3-none-any.whl", hash = "sha256:20cc7d723ed729276e808f26fb6b3599f786cbc37e06c65e192ba77c40f20aac", size = 9981 }, +] diff --git a/build_tools/vitest/setup-crypto.ts b/build_tools/vitest/setup-crypto.ts deleted file mode 100644 index 65e56e55a2..0000000000 --- a/build_tools/vitest/setup-crypto.ts +++ /dev/null @@ -1,7 +0,0 @@ -// Polyfill for missing `crypto` in jsdom. - -import { webcrypto } from "node:crypto"; - -Object.defineProperty(globalThis, "crypto", { - value: webcrypto, -}); diff --git a/build_tools/vitest/test_data_server.ts b/build_tools/vitest/test_data_server.ts new file mode 100644 index 0000000000..cde0e7ce18 --- /dev/null +++ b/build_tools/vitest/test_data_server.ts @@ -0,0 +1,51 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type * as http from "node:http"; +import type { AddressInfo } from "node:net"; +import { createServer } from "http-server"; + +export interface TestDataServer extends AsyncDisposable { + url: string; +} + +export async function startTestDataServer( + rootDirectory: string, +): Promise { + const server: http.Server = ( + createServer({ + root: rootDirectory, + cache: -1, + cors: true, + }) as any + ).server; + // Don't block node from exiting. + server.unref(); + const serverUrl = await new Promise((resolve, reject) => { + server.on("error", reject); + server.listen(0, "localhost", () => { + const port = (server.address() as AddressInfo).port; + resolve(`http://localhost:${port}/`); + }); + }); + console.log(`Serving ${rootDirectory} at ${serverUrl}`); + return { + url: serverUrl, + [Symbol.asyncDispose]: async () => { + await new Promise((resolve) => server.close(resolve)); + }, + }; +} diff --git a/build_tools/webpack/webpack_config_from_cli.cjs b/build_tools/webpack/webpack_config_from_cli.cjs deleted file mode 100644 index a566f4591e..0000000000 --- a/build_tools/webpack/webpack_config_from_cli.cjs +++ /dev/null @@ -1,14 +0,0 @@ -// This module is specified as the webpack config module when `cli.ts` invokes -// `webpack-cli` programmatically. -// -// It simply returns the configuration previously set by `cli.ts`. -// -// This module is in cjs format rather than esm format to avoid a separate copy -// being loaded, for some reason, by tsx. - -let config = undefined; - -module.exports = (...args) => config(...args); -module.exports.setConfig = (newConfig) => { - config = newConfig; -}; diff --git a/docs/_templates/logo.svg b/docs/_templates/logo.svg new file mode 100644 index 0000000000..9984f95361 --- /dev/null +++ b/docs/_templates/logo.svg @@ -0,0 +1 @@ + diff --git a/docs/concepts/layers.rst b/docs/concepts/layers.rst index 319cf7d9db..adfd6eb505 100644 --- a/docs/concepts/layers.rst +++ b/docs/concepts/layers.rst @@ -18,9 +18,27 @@ Layer kinds Image layer ^^^^^^^^^^^ +Image layers display generic volumetric data in a user-configurable way. + .. _image-layer-shader: Image layer shader ~~~~~~~~~~~~~~~~~~ TODO + +.. _segmentation-layer: + +Segmentation layer +^^^^^^^^^^^^^^^^^^ + +Segmentation layers display *segmentations* where each object/class, each +identified by a integer label, is (typically) shown with a distinct color. + +Several kinds of data sources are supported: + +- multi-resolution volumes, which maps spatial locations to the corresponding + object label; +- object surface meshes, which map each object label to a corresponding to mesh; +- object skeleton representations, which map each object label to a + corresponding skeleton representation. diff --git a/docs/conf.py b/docs/conf.py index 6a65555988..8b33c6d910 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -39,6 +39,11 @@ html_title = "Neuroglancer" +html_favicon = "_templates/logo.svg" + +templates_path = ["_templates"] + + # Don't include "View page source" links, since they aren't very helpful, # especially for generated pages. html_show_sourcelink = True @@ -77,8 +82,9 @@ html_theme = "sphinx_immaterial" html_theme_options = { + "logo_svg": "logo.svg", "icon": { - "logo": "material/library", + # "logo": "material/library", "repo": "fontawesome/brands/github", }, "site_url": "https://google.github.io/neuroglancer/", @@ -153,7 +159,10 @@ """ -json_schemas = ["json_schema/*.yml"] +json_schemas = [ + "json_schema/*.yml", + "**/json_schema/*.yml", +] rst_prolog = """ .. role:: python(code) diff --git a/docs/datasource/boss b/docs/datasource/boss new file mode 120000 index 0000000000..92c8cf8fa2 --- /dev/null +++ b/docs/datasource/boss @@ -0,0 +1 @@ +../../src/datasource/boss \ No newline at end of file diff --git a/docs/datasource/byte_range b/docs/datasource/byte_range new file mode 120000 index 0000000000..32c5ddf286 --- /dev/null +++ b/docs/datasource/byte_range @@ -0,0 +1 @@ +../../src/kvstore/byte_range \ No newline at end of file diff --git a/docs/datasource/deepzoom b/docs/datasource/deepzoom new file mode 120000 index 0000000000..ce595c33a2 --- /dev/null +++ b/docs/datasource/deepzoom @@ -0,0 +1 @@ +../../src/datasource/deepzoom \ No newline at end of file diff --git a/docs/datasource/dvid b/docs/datasource/dvid new file mode 120000 index 0000000000..997a8dbaa0 --- /dev/null +++ b/docs/datasource/dvid @@ -0,0 +1 @@ +../../src/datasource/dvid \ No newline at end of file diff --git a/docs/datasource/gcs b/docs/datasource/gcs new file mode 120000 index 0000000000..8decf8fae0 --- /dev/null +++ b/docs/datasource/gcs @@ -0,0 +1 @@ +../../src/kvstore/gcs \ No newline at end of file diff --git a/docs/datasource/gzip b/docs/datasource/gzip new file mode 120000 index 0000000000..2e72b76c19 --- /dev/null +++ b/docs/datasource/gzip @@ -0,0 +1 @@ +../../src/kvstore/gzip \ No newline at end of file diff --git a/docs/datasource/http b/docs/datasource/http new file mode 120000 index 0000000000..84a5507c69 --- /dev/null +++ b/docs/datasource/http @@ -0,0 +1 @@ +../../src/kvstore/http \ No newline at end of file diff --git a/docs/datasource/icechunk b/docs/datasource/icechunk new file mode 120000 index 0000000000..0c7125a4be --- /dev/null +++ b/docs/datasource/icechunk @@ -0,0 +1 @@ +../../src/kvstore/icechunk \ No newline at end of file diff --git a/docs/datasource/index.rst b/docs/datasource/index.rst new file mode 100644 index 0000000000..280477ef18 --- /dev/null +++ b/docs/datasource/index.rst @@ -0,0 +1,131 @@ +.. _data-sources: + +Data sources +============ + +Neuroglancer does not depend on any specific server backend for data access. +Instead, the Neuroglancer client application can access a large number of +different data formats and data API services directly from the browser. + +All data sources are specified using a URL syntax. + +.. _data-formats: + +Data formats +------------ + +Neuroglancer supports the following file- and directory-based data formats +accessible from any of the supported :ref:`key-value stores`. + +.. toctree:: + :maxdepth: 1 + + zarr/index + n5/index + precomputed/index + nifti/index + deepzoom/index + +.. _kvstores: + +Key-value stores +---------------- + +Neuroglancer accesses all `file-based data formats` through +key-value store drivers, which provide a filesystem-like abstraction for reading +files and directories. + +.. _kvstore-url: + +URL syntax +~~~~~~~~~~ + +Key-value stores are specified using a *URL pipeline* syntax consisting of +``|``-delimited sequence of a :ref:`root key-value store URL` +followed by zero or more :ref:`adapter URLs`. + +Examples: + +- :file:`https://{host}/{path}` (:ref:`HTTP kvstore`, for + accessing a file served by an HTTP server) +- :file:`s3://{bucket}/{path}` (:ref:`S3 kvstore`, for + accessing a file on S3) +- :file:`s3://{bucket}/{path}.zip|zip:path/within/zipfile.nii` ( + :ref:`S3 kvstore` with :ref:`zip kvstore` adapter, + for accessing a file within a zipfile on S3) +- + :file:`s3://{bucket}/{path}.zip|zip:inner/zipfile.zip|zip:path/in/nested/inner/zipfile.nii` + (:ref:`S3 kvstore` with :ref:`zip kvstore` adapter + applied twice, for accessing a file within a zipfile within a zipfile on S3) + +.. _root-kvstores: + +Root stores +~~~~~~~~~~~ + +Root key-value stores directly access a storage mechanism. + +.. toctree:: + :maxdepth: 1 + + http/index + gcs/index + s3/index + +.. _kvstore-adapters: + +Adapters +~~~~~~~~ + +Adapters transform some *base* key-value store to present a new key-value store +view, where the *base* key-value store is defined by a :ref:`root +kvstore` with zero or more other +:ref:`adapters` applied to it. + +.. toctree:: + :maxdepth: 1 + + zip/index + ocdbt/index + icechunk/index + gzip/index + byte_range/index + +.. _kvstore-capabilities: + +Capabilities +~~~~~~~~~~~~ + +Neuroglancer relies on a number of different *capabilities* provided by +key-value stores. The documentation for each key-value store details the +specific conditions under which each of these capabilities is supported. + +.. _kvstore-byte-range-reads: + +Byte range reads + Reading just a specific range of bytes, indicated by an offset and a length, + rather than an entire file. In some cases, only *prefix* reads, where the byte + offset is ``0``, are supported. + + This is required to access various data formats, and for file-format + auto-detection. + +.. _kvstore-listing: + +Key listing + Listing of keys under a given prefix. + + This is required for interactive completion of URLs, and for accessing certain + data formats. + +.. _data-services: + +Data services +------------- + +.. toctree:: + :maxdepth: 1 + + boss/index + dvid/index + render/index diff --git a/docs/datasource/n5 b/docs/datasource/n5 new file mode 120000 index 0000000000..eb1672e1ef --- /dev/null +++ b/docs/datasource/n5 @@ -0,0 +1 @@ +../../src/datasource/n5 \ No newline at end of file diff --git a/docs/datasource/nifti b/docs/datasource/nifti new file mode 120000 index 0000000000..44749850cb --- /dev/null +++ b/docs/datasource/nifti @@ -0,0 +1 @@ +../../src/datasource/nifti \ No newline at end of file diff --git a/docs/datasource/ocdbt b/docs/datasource/ocdbt new file mode 120000 index 0000000000..4c6dee3a55 --- /dev/null +++ b/docs/datasource/ocdbt @@ -0,0 +1 @@ +../../src/kvstore/ocdbt \ No newline at end of file diff --git a/docs/datasource/precomputed b/docs/datasource/precomputed new file mode 120000 index 0000000000..b7bda81cff --- /dev/null +++ b/docs/datasource/precomputed @@ -0,0 +1 @@ +../../src/datasource/precomputed \ No newline at end of file diff --git a/docs/datasource/render b/docs/datasource/render new file mode 120000 index 0000000000..a75b482aac --- /dev/null +++ b/docs/datasource/render @@ -0,0 +1 @@ +../../src/datasource/render \ No newline at end of file diff --git a/docs/datasource/s3 b/docs/datasource/s3 new file mode 120000 index 0000000000..3bb2073b24 --- /dev/null +++ b/docs/datasource/s3 @@ -0,0 +1 @@ +../../src/kvstore/s3 \ No newline at end of file diff --git a/docs/datasource/zarr b/docs/datasource/zarr new file mode 120000 index 0000000000..08d130d621 --- /dev/null +++ b/docs/datasource/zarr @@ -0,0 +1 @@ +../../src/datasource/zarr/ \ No newline at end of file diff --git a/docs/datasource/zip b/docs/datasource/zip new file mode 120000 index 0000000000..d19eb8b8d8 --- /dev/null +++ b/docs/datasource/zip @@ -0,0 +1 @@ +../../src/kvstore/zip \ No newline at end of file diff --git a/docs/generate_logo.py b/docs/generate_logo.py new file mode 100755 index 0000000000..6ff217cc9b --- /dev/null +++ b/docs/generate_logo.py @@ -0,0 +1,122 @@ +#!/usr/bin/env python3 +"""Generates the Neuroglancer logo in SVG format.""" + +import argparse + +import numpy as np + + +def write_logo(path: str) -> None: + + letter_cells = np.array( + [ + [1, 0, 0, 0, 0, 0, 0, 0, 1], + [1, 1, 0, 0, 0, 0, 0, 0, 1], + [1, 0, 1, 0, 0, 0, 0, 0, 1], + [1, 0, 0, 1, 0, 0, 0, 0, 1], + [1, 0, 0, 0, 1, 0, 0, 0, 1], + [1, 0, 0, 0, 0, 1, 0, 0, 1], + [1, 0, 0, 0, 0, 0, 1, 0, 1], + [1, 0, 0, 0, 0, 0, 0, 1, 1], + [1, 0, 0, 0, 0, 0, 0, 0, 1], + ], + dtype=bool, + ) + + g_cells = np.array( + [ + [0, 0, 0, 1, 1, 1, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 1, 0, 0], + [0, 1, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 0, 0, 0, 0], + [1, 0, 0, 0, 0, 1, 1, 1, 1], + [1, 0, 0, 0, 0, 0, 0, 0, 1], + [0, 1, 0, 0, 0, 0, 0, 1, 0], + [0, 0, 1, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 1, 1, 1, 0, 0, 0], + ], + dtype=bool, + ) + + width_over_height = letter_cells.shape[1] / letter_cells.shape[0] + + margin = 2 + + base_size = 128 + + screen_size = np.array( + [width_over_height * base_size + 2 * margin, base_size + 2 * margin] + ) + + full_screen_size = np.array( + [width_over_height * base_size * 2 + 4 * margin, base_size * 2 + 4 * margin] + ) + + with open(path, "w") as f: + f.write( + f'" + ) + + grid_line_width = 1.5 + cell_margin = 1.5 + + def draw_grid_letter(letter_cells, xoffset, yoffset): + cell_size = base_size / letter_cells.shape[0] + grid_line_color = fill_color = "currentColor" + # grid_line_color = "#333" + + # Draw horizontal grid lines + for i in range(letter_cells.shape[0] + 1): + f.write( + f'' + ) + + # Draw vertical grid lines + for i in range(letter_cells.shape[1] + 1): + f.write( + f'' + ) + + for y in range(letter_cells.shape[0]): + for x in range(letter_cells.shape[1]): + if not letter_cells[y, x]: + continue + f.write( + f'' + ) + + draw_grid_letter(letter_cells, xoffset=0, yoffset=0) + + draw_grid_letter( + g_cells, xoffset=full_screen_size[0] / 2, yoffset=full_screen_size[1] / 2 + ) + + f.write("\n") + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("output") + + args = parser.parse_args() + write_logo(args.output) + + +if __name__ == "__main__": + main() diff --git a/docs/index.rst b/docs/index.rst index bdd78a65f7..aba9088945 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -16,6 +16,11 @@ Neuroglancer concepts/data_views concepts/layers +.. toctree:: + :hidden: + + datasource/index + .. toctree:: :hidden: :caption: JSON API diff --git a/docs/json_schema/viewer_state.yml b/docs/json_schema/viewer_state.yml index acaba2fea1..31f925b9cd 100644 --- a/docs/json_schema/viewer_state.yml +++ b/docs/json_schema/viewer_state.yml @@ -55,7 +55,7 @@ properties: default: true showSlices: type: boolean - title: "Indicates whether to show cross sections in the 3-d view of `~DataPanelLayoutType.4panel` layouts." + title: "Indicates whether to show cross sections in the 3-d view of `~DataPanelLayoutType.4panel` and `~DataPanelLayoutType.4panel-alt` layouts." default: true gpuMemoryLimit: type: integer @@ -167,12 +167,35 @@ definitions: $id: DataPanelLayoutType title: "Specifies a layout of 3-d projection and 2-d cross-section views for a layer group." oneOf: + - const: "4panel-alt" + title: "2x2 grid layout with `.xy`, `.yz`, `.xz`, and `.3d` panels." + description: | + .. list-table:: + + * - `.xy` cross-section view + - `.yz` cross-section view + * - `.xz` cross-section view + - `.3d` projection view + + If `~ViewerState.showSlices` is ``true``, the `.3d` projection panel + also includes the `.xy`, `.yz`, and `.xz` cross-sections as well. - const: "4panel" title: "2x2 grid layout with `.xy`, `.xz`, `.3d`, and `.yz` panels." description: | - The top left is an `.xy` cross-section view, the top right is an `.xz` - cross-section view, the bottom left is a `.3d` projection view, and the - bottom right is a `.yz` cross-section view. + .. list-table:: + + * - `.xy` cross-section view + - `.xz` cross-section view + * - `.3d` projection view + - `.yz` cross-section view + + If `~ViewerState.showSlices` is ``true``, the `.3d` projection panel + also includes the `.xy`, `.xz`, and `.yz` cross-sections as well. + + .. note:: + + This layout contains the same panels as `.4panel-alt`, but in a + different arrangement. - const: "xy" title: "Single cross-section view in the default orientation." description: | @@ -192,8 +215,11 @@ definitions: - const: "3d" title: "Single 3-d projection view." - const: "xy-3d" + title: "Side-by-side layout with `.xy` and `.3d` panels." - const: "xz-3d" + title: "Side-by-side layout with `.xz` and `.3d` panels." - const: "yz-3d" + title: "Side-by-side layout with `.yz` and `.3d` panels." DataPanelLayout: $id: DataPanelLayout title: "Describes the :ref:`data views` to display." diff --git a/docs/python/api/.gitignore b/docs/python/api/.gitignore deleted file mode 100644 index e15a7a67e2..0000000000 --- a/docs/python/api/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ --index.rst -*.rst diff --git a/docs/python/api/index.rst b/docs/python/api/index.rst index 074fbbec8b..9faf1f92d3 100644 --- a/docs/python/api/index.rst +++ b/docs/python/api/index.rst @@ -1,3 +1,5 @@ +.. _python-api: + API Reference ============= diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000..b15651340a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,125 @@ +// @ts-check + +import eslint from "@eslint/js"; +// @ts-expect-error missing .d.ts file +import importPlugin from "eslint-plugin-import"; +import tseslint from "typescript-eslint"; + +export default tseslint.config( + { + ignores: [ + "**/node_modules", + "**/dist", + "**/python", + "templates/neuroglancer/sliceview", + "src/third_party/jpgjs/jpg.js", + "**/templates", + "**/build", + "**/.tox", + "**/.nox", + "**/.venv", + "lib", + "**/python", + "**/config", + "**/typings", + "src/mesh/draco/stub.js", + "**/tsconfig.tsbuildinfo", + "examples", + ], + }, + eslint.configs.recommended, + tseslint.configs.recommended, + importPlugin.flatConfigs.recommended, + importPlugin.flatConfigs.typescript, + { + settings: { + "import/resolver": { + typescript: {}, + node: {}, + }, + }, + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-this-alias": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + + "prefer-const": [ + "error", + { + destructuring: "all", + }, + ], + + "no-constant-condition": "off", + + "no-unused-disable": "off", + + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + ignoreRestSiblings: true, + }, + ], + + "@typescript-eslint/no-unsafe-function-type": "off", + + "no-unsafe-finally": "off", + "require-yield": "off", + "no-inner-declarations": "off", + + // Supported by oxlint + "import/namespace": "off", + "import/default": "off", + + "import/no-named-as-default": "off", + "import/no-named-as-default-member": "off", + "@typescript-eslint/consistent-type-imports": "error", + "import/no-unresolved": "error", + "import/no-extraneous-dependencies": "error", + + "import/order": [ + "error", + { + groups: ["builtin", "external", "internal"], + + alphabetize: { + order: "asc", + orderImportKind: "asc", + }, + }, + ], + + // Neuroglancer uses `varname;` to suppress unused parameter warnings. + "@typescript-eslint/no-unused-expressions": "off", + }, + }, + { + files: ["src/**/*"], + + rules: { + "no-restricted-imports": [ + "error", + { + patterns: [ + { + group: ["./", "../"], + message: "Relative imports are not allowed.", + }, + ], + }, + ], + }, + }, + { + files: ["build_tools/**/*.cjs"], + languageOptions: { + sourceType: "commonjs", + }, + }, +); diff --git a/examples/README.md b/examples/README.md index 41a0df3e65..78ebd5b272 100644 --- a/examples/README.md +++ b/examples/README.md @@ -31,6 +31,8 @@ Neuroglancer can be used as a dependency in two ways: The following bundlers are known to be compatible: - [webpack](./webpack/) (recommended) +- [rspack](./rspack/) +- [rsbuild](./rsbuild/) - [parcel](./parcel/) - [vite](./vite/) diff --git a/examples/parcel/parcel-project-built/package-lock.json b/examples/parcel/parcel-project-built/package-lock.json index 8b7cb6c2cb..5923e257ab 100644 --- a/examples/parcel/parcel-project-built/package-lock.json +++ b/examples/parcel/parcel-project-built/package-lock.json @@ -23,15 +23,16 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@babel/code-frame": { diff --git a/examples/parcel/parcel-project-built/package.json b/examples/parcel/parcel-project-built/package.json index 5063fb4aa0..f55442b782 100644 --- a/examples/parcel/parcel-project-built/package.json +++ b/examples/parcel/parcel-project-built/package.json @@ -12,6 +12,7 @@ }, "license": "Apache-2.0", "devDependencies": { + "@parcel/config-default": "^2.13.3", "@parcel/transformer-inline-string": "^2.12.0", "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" diff --git a/examples/parcel/parcel-project-built/pnpm-lock.yaml b/examples/parcel/parcel-project-built/pnpm-lock.yaml new file mode 100644 index 0000000000..1c89213a24 --- /dev/null +++ b/examples/parcel/parcel-project-built/pnpm-lock.yaml @@ -0,0 +1,3503 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../../dist/package + version: file:../../../dist/package + devDependencies: + '@parcel/config-default': + specifier: ^2.13.3 + version: 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/transformer-inline-string': + specifier: ^2.12.0 + version: 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + parcel: + specifier: ^2.12.0 + version: 2.13.3(@swc/helpers@0.5.15) + parcel-namer-rewrite: + specifier: ^2.10.3-rc.2 + version: 2.10.3-rc.2(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + +packages: + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lmdb/lmdb-darwin-arm64@2.8.5': + resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@2.8.5': + resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@2.8.5': + resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@2.8.5': + resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@2.8.5': + resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-x64@2.8.5': + resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} + cpu: [x64] + os: [win32] + + '@mischnic/json-sourcemap@0.1.1': + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@parcel/bundler-default@2.13.3': + resolution: {integrity: sha512-mOuWeth0bZzRv1b9Lrvydis/hAzJyePy0gwa0tix3/zyYBvw0JY+xkXVR4qKyD/blc1Ra2qOlfI2uD3ucnsdXA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/cache@2.13.3': + resolution: {integrity: sha512-Vz5+K5uCt9mcuQAMDo0JdbPYDmVdB8Nvu/A2vTEK2rqZPxvoOTczKeMBA4JqzKqGURHPRLaJCvuR8nDG+jhK9A==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/codeframe@2.13.3': + resolution: {integrity: sha512-L/PQf+PT0xM8k9nc0B+PxxOYO2phQYnbuifu9o4pFRiqVmCtHztP+XMIvRJ2gOEXy3pgAImSPFVJ3xGxMFky4g==} + engines: {node: '>= 16.0.0'} + + '@parcel/compressor-raw@2.13.3': + resolution: {integrity: sha512-C6vjDlgTLjYc358i7LA/dqcL0XDQZ1IHXFw6hBaHHOfxPKW2T4bzUI6RURyToEK9Q1X7+ggDKqgdLxwp4veCFg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/config-default@2.13.3': + resolution: {integrity: sha512-WUsx83ic8DgLwwnL1Bua4lRgQqYjxiTT+DBxESGk1paNm1juWzyfPXEQDLXwiCTcWMQGiXQFQ8OuSISauVQ8dQ==} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/core@2.13.3': + resolution: {integrity: sha512-SRZFtqGiaKHlZ2YAvf+NHvBFWS3GnkBvJMfOJM7kxJRK3M1bhbwJa/GgSdzqro5UVf9Bfj6E+pkdrRQIOZ7jMQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/diagnostic@2.13.3': + resolution: {integrity: sha512-C70KXLBaXLJvr7XCEVu8m6TqNdw1gQLxqg5BQ8roR62R4vWWDnOq8PEksxDi4Y8Z/FF4i3Sapv6tRx9iBNxDEg==} + engines: {node: '>= 16.0.0'} + + '@parcel/events@2.13.3': + resolution: {integrity: sha512-ZkSHTTbD/E+53AjUzhAWTnMLnxLEU5yRw0H614CaruGh+GjgOIKyukGeToF5Gf/lvZ159VrJCGE0Z5EpgHVkuQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/feature-flags@2.13.3': + resolution: {integrity: sha512-UZm14QpamDFoUut9YtCZSpG1HxPs07lUwUCpsAYL0PpxASD3oWJQxIJGfDZPa2272DarXDG9adTKrNXvkHZblw==} + engines: {node: '>= 16.0.0'} + + '@parcel/fs@2.13.3': + resolution: {integrity: sha512-+MPWAt0zr+TCDSlj1LvkORTjfB/BSffsE99A9AvScKytDSYYpY2s0t4vtV9unSh0FHMS2aBCZNJ4t7KL+DcPIg==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/graph@3.3.3': + resolution: {integrity: sha512-pxs4GauEdvCN8nRd6wG3st6LvpHske3GfqGwUSR0P0X0pBPI1/NicvXz6xzp3rgb9gPWfbKXeI/2IOTfIxxVfg==} + engines: {node: '>= 16.0.0'} + + '@parcel/logger@2.13.3': + resolution: {integrity: sha512-8YF/ZhsQgd7ohQ2vEqcMD1Ag9JlJULROWRPGgGYLGD+twuxAiSdiFBpN3f+j4gQN4PYaLaIS/SwUFx11J243fQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/markdown-ansi@2.13.3': + resolution: {integrity: sha512-B4rUdlNUulJs2xOQuDbN7Hq5a9roq8IZUcJ1vQ8PAv+zMGb7KCfqIIr/BSCDYGhayfAGBVWW8x55Kvrl1zrDYw==} + engines: {node: '>= 16.0.0'} + + '@parcel/namer-default@2.13.3': + resolution: {integrity: sha512-A2a5A5fuyNcjSGOS0hPcdQmOE2kszZnLIXof7UMGNkNkeC62KAG8WcFZH5RNOY3LT5H773hq51zmc2Y2gE5Rnw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/node-resolver-core@3.4.3': + resolution: {integrity: sha512-IEnMks49egEic1ITBp59VQyHzkSQUXqpU9hOHwqN3KoSTdZ6rEgrXcS3pa6tdXay4NYGlcZ88kFCE8i/xYoVCg==} + engines: {node: '>= 16.0.0'} + + '@parcel/optimizer-css@2.13.3': + resolution: {integrity: sha512-A8o9IVCv919vhv69SkLmyW2WjJR5WZgcMqV6L1uiGF8i8z18myrMhrp2JuSHx29PRT9uNyzNC4Xrd4StYjIhJg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-htmlnano@2.13.3': + resolution: {integrity: sha512-K4Uvg0Sy2pECP7pdvvbud++F0pfcbNkq+IxTrgqBX5HJnLEmRZwgdvZEKF43oMEolclMnURMQRGjRplRaPdbXg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-image@2.13.3': + resolution: {integrity: sha512-wlDUICA29J4UnqkKrWiyt68g1e85qfYhp4zJFcFJL0LX1qqh1QwsLUz3YJ+KlruoqPxJSFEC8ncBEKiVCsqhEQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/optimizer-svgo@2.13.3': + resolution: {integrity: sha512-piIKxQKzhZK54dJR6yqIcq+urZmpsfgUpLCZT3cnWlX4ux5+S2iN66qqZBs0zVn+a58LcWcoP4Z9ieiJmpiu2w==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-swc@2.13.3': + resolution: {integrity: sha512-zNSq6oWqLlW8ksPIDjM0VgrK6ZAJbPQCDvs1V+p0oX3CzEe85lT5VkRpnfrN1+/vvEJNGL8e60efHKpI+rXGTA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/package-manager@2.13.3': + resolution: {integrity: sha512-FLNI5OrZxymGf/Yln0E/kjnGn5sdkQAxW7pQVdtuM+5VeN75yibJRjsSGv88PvJ+KvpD2ANgiIJo1RufmoPcww==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/packager-css@2.13.3': + resolution: {integrity: sha512-ghDqRMtrUwaDERzFm9le0uz2PTeqqsjsW0ihQSZPSAptElRl9o5BR+XtMPv3r7Ui0evo+w35gD55oQCJ28vCig==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-html@2.13.3': + resolution: {integrity: sha512-jDLnKSA/EzVEZ3/aegXO3QJ/Ij732AgBBkIQfeC8tUoxwVz5b3HiPBAjVjcUSfZs7mdBSHO+ELWC3UD+HbsIrQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-js@2.13.3': + resolution: {integrity: sha512-0pMHHf2zOn7EOJe88QJw5h/wcV1bFfj6cXVcE55Wa8GX3V+SdCgolnlvNuBcRQ1Tlx0Xkpo+9hMFVIQbNQY6zw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-raw@2.13.3': + resolution: {integrity: sha512-AWu4UB+akBdskzvT3KGVHIdacU9f7cI678DQQ1jKQuc9yZz5D0VFt3ocFBOmvDfEQDF0uH3jjtJR7fnuvX7Biw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-svg@2.13.3': + resolution: {integrity: sha512-tKGRiFq/4jh5u2xpTstNQ7gu+RuZWzlWqpw5NaFmcKe6VQe5CMcS499xTFoREAGnRvevSeIgC38X1a+VOo+/AA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-wasm@2.13.3': + resolution: {integrity: sha512-SZB56/b230vFrSehVXaUAWjJmWYc89gzb8OTLkBm7uvtFtov2J1R8Ig9TTJwinyXE3h84MCFP/YpQElSfoLkJw==} + engines: {node: '>=16.0.0', parcel: ^2.13.3} + + '@parcel/plugin@2.13.3': + resolution: {integrity: sha512-cterKHHcwg6q11Gpif/aqvHo056TR+yDVJ3fSdiG2xr5KD1VZ2B3hmofWERNNwjMcnR1h9Xq40B7jCKUhOyNFA==} + engines: {node: '>= 16.0.0'} + + '@parcel/profiler@2.13.3': + resolution: {integrity: sha512-ok6BwWSLvyHe5TuSXjSacYnDStFgP5Y30tA9mbtWSm0INDsYf+m5DqzpYPx8U54OaywWMK8w3MXUClosJX3aPA==} + engines: {node: '>= 16.0.0'} + + '@parcel/reporter-cli@2.13.3': + resolution: {integrity: sha512-EA5tKt/6bXYNMEavSs35qHlFdx6cZmRazlZxPBgxPePQYoouNAPMNLUOEQozaPhz9f5fvNDN7EHOFaAWcdO2LA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/reporter-dev-server@2.13.3': + resolution: {integrity: sha512-ZNeFp6AOIQFv7mZIv2P5O188dnZHNg0ymeDVcakfZomwhpSva2dFNS3AnvWo4eyWBlUxkmQO8BtaxeWTs7jAuA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/reporter-tracer@2.13.3': + resolution: {integrity: sha512-aBsVPI8jLZTDkFYrI69GxnsdvZKEYerkPsu935LcX9rfUYssOnmmUP+3oI+8fbg+qNjJuk9BgoQ4hCp9FOphMQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/resolver-default@2.13.3': + resolution: {integrity: sha512-urBZuRALWT9pFMeWQ8JirchLmsQEyI9lrJptiwLbJWrwvmlwSUGkcstmPwoNRf/aAQjICB7ser/247Vny0pFxA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-browser-hmr@2.13.3': + resolution: {integrity: sha512-EAcPojQFUNUGUrDk66cu3ySPO0NXRVS5CKPd4QrxPCVVbGzde4koKu8krC/TaGsoyUqhie8HMnS70qBP0GFfcQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-js@2.13.3': + resolution: {integrity: sha512-62OucNAnxb2Q0uyTFWW/0Hvv2DJ4b5H6neh/YFu2/wmxaZ37xTpEuEcG2do7KW54xE5DeLP+RliHLwi4NvR3ww==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-react-refresh@2.13.3': + resolution: {integrity: sha512-PYZ1klpJVwqE3WuifILjtF1dugtesHEuJcXYZI85T6UoRSD5ctS1nAIpZzT14Ga1lRt/jd+eAmhWL1l3m/Vk1Q==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-service-worker@2.13.3': + resolution: {integrity: sha512-BjMhPuT7Us1+YIo31exPRwomPiL+jrZZS5UUAwlEW2XGHDceEotzRM94LwxeFliCScT4IOokGoxixm19qRuzWg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/rust@2.13.3': + resolution: {integrity: sha512-dLq85xDAtzr3P5200cvxk+8WXSWauYbxuev9LCPdwfhlaWo/JEj6cu9seVdWlkagjGwkoV1kXC+GGntgUXOLAQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/source-map@2.1.1': + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + + '@parcel/transformer-babel@2.13.3': + resolution: {integrity: sha512-ikzK9f5WTFrdQsPitQgjCPH6HmVU8AQPRemIJ2BndYhtodn5PQut5cnSvTrqax8RjYvheEKCQk/Zb/uR7qgS3g==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-css@2.13.3': + resolution: {integrity: sha512-zbrNURGph6JeVADbGydyZ7lcu/izj41kDxQ9xw4RPRW/3rofQiTU0OTREi+uBWiMENQySXVivEdzHA9cA+aLAA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-html@2.13.3': + resolution: {integrity: sha512-Yf74FkL9RCCB4+hxQRVMNQThH9+fZ5w0NLiQPpWUOcgDEEyxTi4FWPQgEBsKl/XK2ehdydbQB9fBgPQLuQxwPg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-image@2.13.3': + resolution: {integrity: sha512-wL1CXyeFAqbp2wcEq/JD3a/tbAyVIDMTC6laQxlIwnVV7dsENhK1qRuJZuoBdixESeUpFQSmmQvDIhcfT/cUUg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/transformer-inline-string@2.13.3': + resolution: {integrity: sha512-xxFCpY9NKJJ05tECb6nYjswAg0SDccuVeGTuNNXBOSMT2UPSAFZdjVYLjXOiKV417ffJ36ZqLkHDluxNoN++yA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-js@2.13.3': + resolution: {integrity: sha512-KqfNGn1IHzDoN2aPqt4nDksgb50Xzcny777C7A7hjlQ3cmkjyJrixYjzzsPaPSGJ+kJpknh3KE8unkQ9mhFvRQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/transformer-json@2.13.3': + resolution: {integrity: sha512-rrq0ab6J0w9ePtsxi0kAvpCmrUYXXAx1Z5PATZakv89rSYbHBKEdXxyCoKFui/UPVCUEGVs5r0iOFepdHpIyeA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-postcss@2.13.3': + resolution: {integrity: sha512-AIiWpU0QSFBrPcYIqAnhqB8RGE6yHFznnxztfg1t2zMSOnK3xoU6xqYKv8H/MduShGGrC3qVOeDfM8MUwzL3cw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-posthtml@2.13.3': + resolution: {integrity: sha512-5GSLyccpHASwFAu3uJ83gDIBSvfsGdVmhJvy0Vxe+K1Fklk2ibhvvtUHMhB7mg6SPHC+R9jsNc3ZqY04ZLeGjw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-raw@2.13.3': + resolution: {integrity: sha512-BFsAbdQF0l8/Pdb7dSLJeYcd8jgwvAUbHgMink2MNXJuRUvDl19Gns8jVokU+uraFHulJMBj40+K/RTd33in4g==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-react-refresh-wrap@2.13.3': + resolution: {integrity: sha512-mOof4cRyxsZRdg8kkWaFtaX98mHpxUhcGPU+nF9RQVa9q737ItxrorsPNR9hpZAyE2TtFNflNW7RoYsgvlLw8w==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-svg@2.13.3': + resolution: {integrity: sha512-9jm7ZF4KHIrGLWlw/SFUz5KKJ20nxHvjFAmzde34R9Wu+F1BOjLZxae7w4ZRwvIc+UVOUcBBQFmhSVwVDZg6Dw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/types-internal@2.13.3': + resolution: {integrity: sha512-Lhx0n+9RCp+Ipktf/I+CLm3zE9Iq9NtDd8b2Vr5lVWyoT8AbzBKIHIpTbhLS4kjZ80L3I6o93OYjqAaIjsqoZw==} + + '@parcel/types@2.13.3': + resolution: {integrity: sha512-+RpFHxx8fy8/dpuehHUw/ja9PRExC3wJoIlIIF42E7SLu2SvlTHtKm6EfICZzxCXNEBzjoDbamCRcN0nmTPlhw==} + + '@parcel/utils@2.13.3': + resolution: {integrity: sha512-yxY9xw2wOUlJaScOXYZmMGoZ4Ck4Kqj+p6Koe5kLkkWM1j98Q0Dj2tf/mNvZi4yrdnlm+dclCwNRnuE8Q9D+pw==} + engines: {node: '>= 16.0.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@parcel/workers@2.13.3': + resolution: {integrity: sha512-oAHmdniWTRwwwsKbcF4t3VjOtKN+/W17Wj5laiYB+HLkfsjGTfIQPj3sdXmrlBAGpI4omIcvR70PHHXnfdTfwA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@swc/core-darwin-arm64@1.10.14': + resolution: {integrity: sha512-Dh4VyrhDDb05tdRmqJ/MucOPMTnrB4pRJol18HVyLlqu1HOT5EzonUniNTCdQbUXjgdv5UVJSTE1lYTzrp+myA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.10.14': + resolution: {integrity: sha512-KpzotL/I0O12RE3tF8NmQErINv0cQe/0mnN/Q50ESFzB5kU6bLgp2HMnnwDTm/XEZZRJCNe0oc9WJ5rKbAJFRQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.10.14': + resolution: {integrity: sha512-20yRXZjMJVz1wp1TcscKiGTVXistG+saIaxOmxSNQia1Qun3hSWLL+u6+5kXbfYGr7R2N6kqSwtZbIfJI25r9Q==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.10.14': + resolution: {integrity: sha512-Gy7cGrNkiMfPxQyLGxdgXPwyWzNzbHuWycJFcoKBihxZKZIW8hkPBttkGivuLC+0qOgsV2/U+S7tlvAju7FtmQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.10.14': + resolution: {integrity: sha512-+oYVqJvFw62InZ8PIy1rBACJPC2WTe4vbVb9kM1jJj2D7dKLm9acnnYIVIDsM5Wo7Uab8RvPHXVbs19IBurzuw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.10.14': + resolution: {integrity: sha512-OmEbVEKQFLQVHwo4EJl9osmlulURy46k232Opfpn/1ji0t2KcNCci3POsnfMuoZjLkGJv8vGNJdPQxX+CP+wSA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.10.14': + resolution: {integrity: sha512-OZW+Icm8DMPqHbhdxplkuG8qrNnPk5i7xJOZWYi1y5bTjgGFI4nEzrsmmeHKMdQTaWwsFrm3uK1rlyQ48MmXmg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.10.14': + resolution: {integrity: sha512-sTvc+xrDQXy3HXZFtTEClY35Efvuc3D+busYm0+rb1+Thau4HLRY9WP+sOKeGwH9/16rzfzYEqD7Ds8A9ykrHw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.10.14': + resolution: {integrity: sha512-j2iQ4y9GWTKtES5eMU0sDsFdYni7IxME7ejFej25Tv3Fq4B+U9tgtYWlJwh1858nIWDXelHiKcSh/UICAyVMdQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.10.14': + resolution: {integrity: sha512-TYtWkUSMkjs0jGPeWdtWbex4B+DlQZmN/ySVLiPI+EltYCLEXsFMkVFq6aWn48dqFHggFK0UYfvDrJUR2c3Qxg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.10.14': + resolution: {integrity: sha512-WSrnE6JRnH20ZYjOOgSS4aOaPv9gxlkI2KRkN24kagbZnPZMnN8bZZyzw1rrLvwgpuRGv17Uz+hflosbR+SP6w==} + 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.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.91: + resolution: {integrity: sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + for-each@0.3.4: + resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-port@4.2.0: + resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + htmlnano@2.1.1: + resolution: {integrity: sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==} + peerDependencies: + cssnano: ^7.0.0 + postcss: ^8.3.11 + purgecss: ^6.0.0 + relateurl: ^0.2.7 + srcset: 5.0.1 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + + htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lmdb@2.8.5: + resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} + hasBin: true + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.2: + resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + + neuroglancer@file:../../../dist/package: + resolution: {directory: ../../../dist/package, type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + ordered-binary@1.5.3: + resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parcel-namer-rewrite@2.10.3-rc.2: + resolution: {integrity: sha512-vn49fDbgQTjp+GX8hsa5LxQOkqo9o5uOTr86FbG2QrbZMo4ct1j/X2ZCe1LijLCgugVDebAHI6eooKlfAUirRQ==} + engines: {node: '>= 10.0.0', parcel: ^2.10.3} + + parcel@2.13.3: + resolution: {integrity: sha512-8GrC8C7J8mwRpAlk7EJ7lwdFTbCN+dcXH2gy5AsEs9pLfzo9wvxOTx6W0fzSlvCOvZOita+8GdfYlGfEt0tRgA==} + engines: {node: '>= 16.0.0'} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + + posthtml-parser@0.12.1: + resolution: {integrity: sha512-rYFmsDLfYm+4Ts2Oh4DCDSZPtdC1BLnRXAobypVzX9alj28KGl65dIFtgDY9zB57D0TC4Qxqrawuq/2et1P0GA==} + engines: {node: '>=16'} + + posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + + posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.25.9': {} + + '@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 + + '@lezer/common@1.2.3': {} + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lmdb/lmdb-darwin-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-darwin-x64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm@2.8.5': + optional: true + + '@lmdb/lmdb-linux-x64@2.8.5': + optional: true + + '@lmdb/lmdb-win32-x64@2.8.5': + optional: true + + '@mischnic/json-sourcemap@0.1.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/lr': 1.4.2 + json5: 2.2.3 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@one-ini/wasm@0.1.1': {} + + '@parcel/bundler-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/graph': 3.3.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/cache@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/utils': 2.13.3 + lmdb: 2.8.5 + + '@parcel/codeframe@2.13.3': + dependencies: + chalk: 4.1.2 + + '@parcel/compressor-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/config-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/bundler-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/compressor-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/namer-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-htmlnano': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-image': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-svgo': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-swc': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/packager-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-html': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-svg': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-wasm': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/resolver-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-browser-hmr': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-react-refresh': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-service-worker': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-babel': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-html': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-image': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-json': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-postcss': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-posthtml': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-react-refresh-wrap': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-svg': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + '@parcel/core@2.13.3(@swc/helpers@0.5.15)': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/graph': 3.3.3 + '@parcel/logger': 2.13.3 + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/profiler': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + base-x: 3.0.10 + browserslist: 4.24.4 + clone: 2.1.2 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + json5: 2.2.3 + msgpackr: 1.11.2 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@swc/helpers' + + '@parcel/diagnostic@2.13.3': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + + '@parcel/events@2.13.3': {} + + '@parcel/feature-flags@2.13.3': {} + + '@parcel/fs@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/feature-flags': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/types-internal': 2.13.3 + '@parcel/utils': 2.13.3 + '@parcel/watcher': 2.5.1 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + + '@parcel/graph@3.3.3': + dependencies: + '@parcel/feature-flags': 2.13.3 + nullthrows: 1.1.1 + + '@parcel/logger@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + + '@parcel/markdown-ansi@2.13.3': + dependencies: + chalk: 4.1.2 + + '@parcel/namer-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/node-resolver-core@3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-htmlnano@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + htmlnano: 2.1.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + '@parcel/optimizer-image@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + + '@parcel/optimizer-svgo@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-swc@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + '@swc/core': 1.10.14(@swc/helpers@0.5.15) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + + '@parcel/package-manager@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/node-resolver-core': 3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@swc/core': 1.10.14(@swc/helpers@0.5.15) + semver: 7.7.1 + transitivePeerDependencies: + - '@swc/helpers' + + '@parcel/packager-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-html@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-svg@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-wasm@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/plugin@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/profiler@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/types-internal': 2.13.3 + chrome-trace-event: 1.0.4 + + '@parcel/reporter-cli@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/reporter-dev-server@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/reporter-tracer@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chrome-trace-event: 1.0.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/resolver-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/node-resolver-core': 3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-browser-hmr@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-react-refresh@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + react-error-overlay: 6.0.9 + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-service-worker@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/rust@2.13.3': {} + + '@parcel/source-map@2.1.1': + dependencies: + detect-libc: 1.0.3 + + '@parcel/transformer-babel@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-html@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-image@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + nullthrows: 1.1.1 + + '@parcel/transformer-inline-string@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@swc/helpers': 0.5.15 + browserslist: 4.24.4 + nullthrows: 1.1.1 + regenerator-runtime: 0.14.1 + semver: 7.7.1 + + '@parcel/transformer-json@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-postcss@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-posthtml@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-react-refresh-wrap@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-svg@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/types-internal@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/source-map': 2.1.1 + utility-types: 3.11.0 + + '@parcel/types@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/types-internal': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/utils@2.13.3': + dependencies: + '@parcel/codeframe': 2.13.3 + '@parcel/diagnostic': 2.13.3 + '@parcel/logger': 2.13.3 + '@parcel/markdown-ansi': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@parcel/workers@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/logger': 2.13.3 + '@parcel/profiler': 2.13.3 + '@parcel/types-internal': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@swc/core-darwin-arm64@1.10.14': + optional: true + + '@swc/core-darwin-x64@1.10.14': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.10.14': + optional: true + + '@swc/core-linux-arm64-gnu@1.10.14': + optional: true + + '@swc/core-linux-arm64-musl@1.10.14': + optional: true + + '@swc/core-linux-x64-gnu@1.10.14': + optional: true + + '@swc/core-linux-x64-musl@1.10.14': + optional: true + + '@swc/core-win32-arm64-msvc@1.10.14': + optional: true + + '@swc/core-win32-ia32-msvc@1.10.14': + optional: true + + '@swc/core-win32-x64-msvc@1.10.14': + optional: true + + '@swc/core@1.10.14(@swc/helpers@0.5.15)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.10.14 + '@swc/core-darwin-x64': 1.10.14 + '@swc/core-linux-arm-gnueabihf': 1.10.14 + '@swc/core-linux-arm64-gnu': 1.10.14 + '@swc/core-linux-arm64-musl': 1.10.14 + '@swc/core-linux-x64-gnu': 1.10.14 + '@swc/core-linux-x64-musl': 1.10.14 + '@swc/core-win32-arm64-msvc': 1.10.14 + '@swc/core-win32-ia32-msvc': 1.10.14 + '@swc/core-win32-x64-msvc': 1.10.14 + '@swc/helpers': 0.5.15 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.17': + dependencies: + '@swc/counter': 0.1.3 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + argparse@2.0.1: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assert@2.1.0: + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.91 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chrome-trace-event@1.0.4: {} + + clone@2.1.2: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + cosmiconfig@9.0.0: + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.7 + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + electron-to-chromium@1.5.91: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@2.2.0: {} + + entities@3.0.1: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + for-each@0.3.4: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + function-bind@1.1.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@4.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + gopd@1.2.0: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + htmlnano@2.1.1: + dependencies: + cosmiconfig: 9.0.0 + posthtml: 0.16.6 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + + htmlparser2@7.2.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-arrayish@0.2.1: {} + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-json@2.0.1: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lightningcss-darwin-arm64@1.29.1: + optional: true + + lightningcss-darwin-x64@1.29.1: + optional: true + + lightningcss-freebsd-x64@1.29.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.1: + optional: true + + lightningcss-linux-x64-musl@1.29.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.1: + optional: true + + lightningcss@1.29.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.1 + lightningcss-darwin-x64: 1.29.1 + lightningcss-freebsd-x64: 1.29.1 + lightningcss-linux-arm-gnueabihf: 1.29.1 + lightningcss-linux-arm64-gnu: 1.29.1 + lightningcss-linux-arm64-musl: 1.29.1 + lightningcss-linux-x64-gnu: 1.29.1 + lightningcss-linux-x64-musl: 1.29.1 + lightningcss-win32-arm64-msvc: 1.29.1 + lightningcss-win32-x64-msvc: 1.29.1 + + lines-and-columns@1.2.4: {} + + lmdb@2.8.5: + dependencies: + msgpackr: 1.11.2 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.1.1 + ordered-binary: 1.5.3 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.8.5 + '@lmdb/lmdb-darwin-x64': 2.8.5 + '@lmdb/lmdb-linux-arm': 2.8.5 + '@lmdb/lmdb-linux-arm64': 2.8.5 + '@lmdb/lmdb-linux-x64': 2.8.5 + '@lmdb/lmdb-win32-x64': 2.8.5 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.2: + optionalDependencies: + msgpackr-extract: 3.0.3 + + neuroglancer@file:../../../dist/package: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + node-addon-api@6.1.0: {} + + node-addon-api@7.1.1: {} + + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.3 + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + optional: true + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + nullthrows@1.1.1: {} + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + ordered-binary@1.5.3: {} + + package-json-from-dist@1.0.1: {} + + parcel-namer-rewrite@2.10.3-rc.2(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15): + dependencies: + '@parcel/logger': 2.13.3 + '@parcel/namer-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + assert: 2.1.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + + parcel@2.13.3(@swc/helpers@0.5.15): + dependencies: + '@parcel/config-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/reporter-cli': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-tracer': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chalk: 4.1.2 + commander: 12.1.0 + get-port: 4.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pn@1.1.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + posthtml-parser@0.11.0: + dependencies: + htmlparser2: 7.2.0 + + posthtml-parser@0.12.1: + dependencies: + htmlparser2: 9.1.0 + + posthtml-render@3.0.0: + dependencies: + is-json: 2.0.1 + + posthtml@0.16.6: + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + react-error-overlay@6.0.9: {} + + react-refresh@0.14.2: {} + + regenerator-runtime@0.14.1: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + resolve-from@4.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map@0.6.1: + optional: true + + srcset@4.0.0: {} + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + symbol-tree@3.2.4: {} + + term-size@2.2.1: {} + + timsort@0.3.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-fest@0.20.2: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + + utility-types@3.11.0: {} + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + weak-lru-cache@1.2.2: {} + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/parcel/parcel-project-source/package-lock.json b/examples/parcel/parcel-project-source/package-lock.json index a365a3d15c..6f313c22a6 100644 --- a/examples/parcel/parcel-project-source/package-lock.json +++ b/examples/parcel/parcel-project-source/package-lock.json @@ -22,51 +22,61 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.7", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", + "playwright": "^1.49.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -77,99 +87,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -716,26 +633,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -749,6 +652,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -757,6 +662,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -765,6 +672,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -779,16 +688,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -842,6 +748,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -1075,6 +983,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -1086,6 +996,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -1097,8 +1009,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -1106,24 +1016,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1133,27 +1028,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1163,6 +1043,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1173,81 +1055,24 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1267,11 +1092,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1280,74 +1100,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -1359,12 +1111,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -1387,199 +1143,18 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/@vitest/browser": { - "version": "1.3.1", + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { @@ -1728,6 +1303,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1745,6 +1322,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1759,6 +1338,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1770,6 +1351,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1781,6 +1364,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1794,12 +1379,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1811,6 +1400,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1822,6 +1413,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1845,6 +1438,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1853,22 +1448,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1878,12 +1481,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1895,6 +1502,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1903,6 +1512,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1910,12 +1521,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1931,6 +1546,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1943,6 +1560,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1954,6 +1573,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1967,68 +1588,31 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "../../../node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -2037,18 +1621,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -2064,8 +1636,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -2075,8 +1645,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2088,6 +1656,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -2104,8 +1674,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -2114,8 +1682,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -2137,118 +1703,14 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, + "optional": true, + "peer": true, "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" + "ajv": "^6.9.1" } }, "../../../node_modules/ansi-regex": { @@ -2271,22 +1733,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -2304,6 +1756,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -2320,6 +1774,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2338,6 +1794,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2349,6 +1807,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2362,6 +1822,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2380,6 +1842,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -2403,11 +1867,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2426,14 +1885,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -2532,6 +1983,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -2539,18 +1992,12 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -2560,14 +2007,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2593,7 +2032,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -2603,13 +2044,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2621,13 +2064,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2649,21 +2094,20 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2675,318 +2119,117 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", + "../../../node_modules/bluebird": { + "version": "3.4.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "balanced-match": "^1.0.0" } }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", + "../../../node_modules/braces": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "../../../node_modules/bluebird": { - "version": "3.4.7", - "dev": true, - "license": "MIT" + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", + "../../../node_modules/browserslist": { + "version": "4.23.0", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": "*" } }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "../../../node_modules/buffer-from": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } + "optional": true, + "peer": true }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", + "../../../node_modules/buffers": { + "version": "0.1.1", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "../../../node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/browser-process-hrtime": { - "version": "1.0.0", - "license": "BSD-2-Clause" - }, - "../../../node_modules/browserslist": { - "version": "4.23.0", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "../../../node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "../../../node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "../../../node_modules/buffers": { - "version": "0.1.1", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">=0.2.0" } }, "../../../node_modules/cac": { @@ -3001,6 +2244,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -3009,6 +2254,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -3026,6 +2273,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3054,26 +2303,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -3091,7 +2320,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -3118,6 +2349,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -3148,44 +2381,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -3194,6 +2395,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -3201,67 +2404,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -3348,11 +2490,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3363,115 +2500,52 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^5.0.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "../../../node_modules/compress-commons/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", + "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 12.0.0" } }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", + "../../../node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "ms": "2.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -3496,73 +2570,15 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" - }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -3575,6 +2591,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -3587,6 +2605,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3600,6 +2620,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -3608,6 +2630,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3626,17 +2650,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -3688,39 +2718,17 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true - }, - "../../../node_modules/css-what": { - "version": "6.1.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -3736,16 +2744,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -3756,9 +2760,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -3774,6 +2776,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -3782,8 +2786,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -3797,8 +2799,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -3810,8 +2810,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3820,8 +2818,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3830,8 +2826,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -3865,6 +2859,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3875,129 +2871,17 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../../node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/deep-eql": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/deep-is": { - "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/deepmerge-ts": { - "version": "5.1.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "../../../node_modules/default-browser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", + "../../../node_modules/decompress-response": { + "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { "node": ">=10" }, @@ -4005,61 +2889,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", + "../../../node_modules/deep-eql": { + "version": "4.1.3", "dev": true, "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, "engines": { "node": ">=6" } }, - "../../../node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { - "node": ">=0.8" + "node": ">=16.0.0" } }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -4077,17 +2950,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/define-properties": { "version": "1.2.1", "dev": true, @@ -4108,6 +2970,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -4124,31 +2988,16 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -4162,15 +3011,12 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -4180,28 +3026,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -4213,44 +3037,10 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -4262,48 +3052,10 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -4311,7 +3063,10 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -4332,6 +3087,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -4348,6 +3105,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4364,6 +3123,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4372,6 +3133,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4418,44 +3181,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" - }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4472,45 +3214,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4566,7 +3269,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4632,31 +3337,14 @@ "@esbuild/linux-mips64el": "0.20.1", "@esbuild/linux-ppc64": "0.20.1", "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" - } - }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" } }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { @@ -5019,11 +3707,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -5037,6 +3720,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -5108,18 +3792,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -5162,71 +3834,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -5354,106 +3961,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -5525,6 +4032,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5537,26 +4045,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -5629,75 +4117,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -5716,6 +4135,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -5735,6 +4156,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -5752,27 +4175,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -5780,7 +4182,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -5816,14 +4220,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5832,17 +4228,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5865,6 +4250,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -5889,59 +4276,14 @@ } }, "../../../node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", + "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "../../../node_modules/find-up": { @@ -5985,25 +4327,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.5", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -6033,223 +4356,10 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "../../../node_modules/form-data": { "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -6263,6 +4373,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -6271,6 +4383,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -6278,26 +4392,12 @@ "node": ">=12.20.0" } }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/fs-extra": { "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6311,15 +4411,12 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -6343,6 +4440,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -6357,6 +4456,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6366,6 +4467,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6385,6 +4488,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6396,6 +4501,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -6405,6 +4512,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6440,6 +4548,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -6461,6 +4571,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6472,6 +4584,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6484,6 +4598,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6496,6 +4612,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -6504,6 +4622,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -6548,6 +4668,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -6596,6 +4718,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -6610,6 +4734,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -6658,22 +4784,10 @@ }, "../../../node_modules/glob-to-regexp": { "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6714,42 +4828,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -6765,6 +4843,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -6789,6 +4869,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -6804,7 +4886,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -6825,11 +4909,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6848,13 +4927,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -6920,6 +4992,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6928,31 +5001,10 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -6960,152 +5012,22 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -7115,40 +5037,6 @@ "node": ">= 6" } }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/http-signature": { "version": "1.2.0", "license": "MIT", @@ -7166,6 +5054,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -7178,8 +5068,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -7234,7 +5122,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -7474,115 +5364,40 @@ "version": "6.5.0", "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "../../../node_modules/ikonate/node_modules/ws": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - }, - "../../../node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "../../../node_modules/import-local/node_modules/p-locate": { + "../../../node_modules/ikonate/node_modules/ws": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", + "../../../node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -7607,19 +5422,8 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", - "license": "ISC" - }, - "../../../node_modules/ini": { - "version": "2.0.0", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" + "license": "ISC" }, "../../../node_modules/internal-slot": { "version": "1.0.6", @@ -7634,18 +5438,12 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -7657,15 +5455,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" - } + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -7680,11 +5472,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7696,17 +5483,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7739,6 +5515,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -7761,20 +5538,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -7808,49 +5571,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7862,17 +5582,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -7907,6 +5616,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -7928,9 +5639,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -8015,17 +5724,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -8044,22 +5742,9 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -8094,26 +5779,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8127,6 +5798,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8155,11 +5828,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -8179,8 +5847,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -8230,7 +5896,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -8249,17 +5917,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -8269,6 +5926,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8280,6 +5939,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -8319,6 +5980,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -8326,19 +5989,12 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -8430,37 +6086,23 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -8480,6 +6122,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -8490,6 +6134,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8522,7 +6168,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -8533,46 +6181,19 @@ "version": "4.7.0", "license": "MIT" }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/lodash.zip": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "version": "4.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -8584,7 +6205,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -8594,18 +6217,12 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8631,48 +6248,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -8686,14 +6261,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -8706,17 +6273,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8734,18 +6290,12 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8753,79 +6303,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8841,6 +6318,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8856,12 +6334,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -8893,22 +6375,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -8932,23 +6404,19 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -8960,15 +6428,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8983,6 +6442,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -8991,6 +6452,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -9004,18 +6467,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -9034,6 +6491,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9042,6 +6501,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -9049,28 +6510,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -9085,9 +6524,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -9096,14 +6533,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -9180,67 +6609,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "wrappy": "1" } }, "../../../node_modules/opener": { @@ -9267,68 +6641,12 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/p-cancelable": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -9361,34 +6679,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -9407,6 +6703,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -9418,6 +6716,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -9430,6 +6730,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -9442,6 +6744,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -9450,15 +6754,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -9470,46 +6765,10 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -9536,6 +6795,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -9552,19 +6812,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9604,96 +6851,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/pkg-types": { "version": "1.0.3", "dev": true, @@ -9842,15 +6999,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9877,12 +7025,17 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -9891,30 +7044,12 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -9933,6 +7068,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -9944,6 +7081,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -9956,6 +7095,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -9968,6 +7109,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -9975,7 +7118,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -9985,6 +7130,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10001,6 +7148,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -10024,12 +7173,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -10056,14 +7209,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -10087,12 +7240,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -10100,64 +7257,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -10165,7 +7274,10 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10178,16 +7290,24 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -10196,6 +7316,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10203,28 +7325,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -10241,26 +7341,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -10360,14 +7440,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, @@ -10375,6 +7447,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -10391,26 +7464,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -10432,6 +7488,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -10446,6 +7504,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -10453,35 +7513,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" - } + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -10495,7 +7529,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -10585,17 +7621,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -10621,7 +7646,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -10686,8 +7713,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -10699,6 +7724,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -10712,23 +7739,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -10739,164 +7749,43 @@ "semver": "bin/semver.js" }, "engines": { - "node": ">=10" - } - }, - "../../../node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serialize-error": { - "version": "11.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/serialize-javascript": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", + "../../../node_modules/serialize-error": { + "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^2.12.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/serve-static": { - "version": "1.15.0", + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" + "randombytes": "^2.1.0" } }, "../../../node_modules/set-function-length": { @@ -10930,12 +7819,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" - }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -10956,10 +7842,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -10977,14 +7859,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -11013,11 +7887,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -11031,61 +7900,23 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "../../../node_modules/smart-buffer": { "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -11099,6 +7930,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -11112,6 +7945,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -11119,15 +7954,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -11145,56 +7975,19 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -11202,189 +7995,43 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", "license": "MIT", "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", + "../../../node_modules/stackback": { + "version": "0.0.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -11396,6 +8043,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -11403,14 +8052,20 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -11576,21 +8231,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -11602,20 +8242,9 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11624,97 +8253,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "../../../node_modules/symbol-tree": { "version": "3.2.4", "license": "MIT" }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -11727,6 +8269,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -11740,31 +8284,20 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -11782,6 +8315,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -11814,7 +8349,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -11824,38 +8361,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" - }, - "../../../node_modules/through2": { - "version": "0.6.5", "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -11889,14 +8397,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11909,8 +8409,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -11925,8 +8423,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -11937,18 +8433,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" - }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -11975,7 +8462,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -12436,6 +8925,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -12443,18 +8934,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -12516,10 +8995,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -12555,6 +9030,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -12578,6 +9055,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12592,24 +9071,16 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -12641,6 +9112,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -12663,8 +9136,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -12673,40 +9144,22 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } }, "../../../node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" - }, - "../../../node_modules/utila": { - "version": "0.4.0", "dev": true, "license": "MIT" }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "license": "MIT", + "bin": { + "uuid": "bin/uuid" } }, "../../../node_modules/verror": { @@ -12927,10 +9380,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -12942,8 +9391,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -12955,6 +9402,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -12971,6 +9420,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12979,26 +9430,12 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -13007,6 +9444,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -13028,6 +9467,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -13070,8 +9511,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -13080,6 +9519,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -13192,260 +9633,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -13459,19 +9646,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13484,6 +9664,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -13492,6 +9674,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -13500,31 +9684,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -13540,8 +9705,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -13611,20 +9774,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, @@ -13749,9 +9898,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -13760,13 +9907,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -13779,14 +9919,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, @@ -13854,6 +9986,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -13867,6 +10001,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/parcel/parcel-project-source/package.json b/examples/parcel/parcel-project-source/package.json index b1def66f76..e1d7e14bc4 100644 --- a/examples/parcel/parcel-project-source/package.json +++ b/examples/parcel/parcel-project-source/package.json @@ -12,6 +12,7 @@ }, "license": "Apache-2.0", "devDependencies": { + "@parcel/config-default": "^2.13.3", "@parcel/transformer-inline-string": "^2.12.0", "parcel": "^2.12.0", "parcel-namer-rewrite": "^2.10.3-rc.2" diff --git a/examples/parcel/parcel-project-source/pnpm-lock.yaml b/examples/parcel/parcel-project-source/pnpm-lock.yaml new file mode 100644 index 0000000000..16d34fa005 --- /dev/null +++ b/examples/parcel/parcel-project-source/pnpm-lock.yaml @@ -0,0 +1,3503 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../.. + version: file:../../.. + devDependencies: + '@parcel/config-default': + specifier: ^2.13.3 + version: 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/transformer-inline-string': + specifier: ^2.12.0 + version: 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + parcel: + specifier: ^2.12.0 + version: 2.13.3(@swc/helpers@0.5.15) + parcel-namer-rewrite: + specifier: ^2.10.3-rc.2 + version: 2.10.3-rc.2(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + +packages: + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@lmdb/lmdb-darwin-arm64@2.8.5': + resolution: {integrity: sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@2.8.5': + resolution: {integrity: sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@2.8.5': + resolution: {integrity: sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@2.8.5': + resolution: {integrity: sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@2.8.5': + resolution: {integrity: sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-x64@2.8.5': + resolution: {integrity: sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==} + cpu: [x64] + os: [win32] + + '@mischnic/json-sourcemap@0.1.1': + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@parcel/bundler-default@2.13.3': + resolution: {integrity: sha512-mOuWeth0bZzRv1b9Lrvydis/hAzJyePy0gwa0tix3/zyYBvw0JY+xkXVR4qKyD/blc1Ra2qOlfI2uD3ucnsdXA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/cache@2.13.3': + resolution: {integrity: sha512-Vz5+K5uCt9mcuQAMDo0JdbPYDmVdB8Nvu/A2vTEK2rqZPxvoOTczKeMBA4JqzKqGURHPRLaJCvuR8nDG+jhK9A==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/codeframe@2.13.3': + resolution: {integrity: sha512-L/PQf+PT0xM8k9nc0B+PxxOYO2phQYnbuifu9o4pFRiqVmCtHztP+XMIvRJ2gOEXy3pgAImSPFVJ3xGxMFky4g==} + engines: {node: '>= 16.0.0'} + + '@parcel/compressor-raw@2.13.3': + resolution: {integrity: sha512-C6vjDlgTLjYc358i7LA/dqcL0XDQZ1IHXFw6hBaHHOfxPKW2T4bzUI6RURyToEK9Q1X7+ggDKqgdLxwp4veCFg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/config-default@2.13.3': + resolution: {integrity: sha512-WUsx83ic8DgLwwnL1Bua4lRgQqYjxiTT+DBxESGk1paNm1juWzyfPXEQDLXwiCTcWMQGiXQFQ8OuSISauVQ8dQ==} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/core@2.13.3': + resolution: {integrity: sha512-SRZFtqGiaKHlZ2YAvf+NHvBFWS3GnkBvJMfOJM7kxJRK3M1bhbwJa/GgSdzqro5UVf9Bfj6E+pkdrRQIOZ7jMQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/diagnostic@2.13.3': + resolution: {integrity: sha512-C70KXLBaXLJvr7XCEVu8m6TqNdw1gQLxqg5BQ8roR62R4vWWDnOq8PEksxDi4Y8Z/FF4i3Sapv6tRx9iBNxDEg==} + engines: {node: '>= 16.0.0'} + + '@parcel/events@2.13.3': + resolution: {integrity: sha512-ZkSHTTbD/E+53AjUzhAWTnMLnxLEU5yRw0H614CaruGh+GjgOIKyukGeToF5Gf/lvZ159VrJCGE0Z5EpgHVkuQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/feature-flags@2.13.3': + resolution: {integrity: sha512-UZm14QpamDFoUut9YtCZSpG1HxPs07lUwUCpsAYL0PpxASD3oWJQxIJGfDZPa2272DarXDG9adTKrNXvkHZblw==} + engines: {node: '>= 16.0.0'} + + '@parcel/fs@2.13.3': + resolution: {integrity: sha512-+MPWAt0zr+TCDSlj1LvkORTjfB/BSffsE99A9AvScKytDSYYpY2s0t4vtV9unSh0FHMS2aBCZNJ4t7KL+DcPIg==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/graph@3.3.3': + resolution: {integrity: sha512-pxs4GauEdvCN8nRd6wG3st6LvpHske3GfqGwUSR0P0X0pBPI1/NicvXz6xzp3rgb9gPWfbKXeI/2IOTfIxxVfg==} + engines: {node: '>= 16.0.0'} + + '@parcel/logger@2.13.3': + resolution: {integrity: sha512-8YF/ZhsQgd7ohQ2vEqcMD1Ag9JlJULROWRPGgGYLGD+twuxAiSdiFBpN3f+j4gQN4PYaLaIS/SwUFx11J243fQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/markdown-ansi@2.13.3': + resolution: {integrity: sha512-B4rUdlNUulJs2xOQuDbN7Hq5a9roq8IZUcJ1vQ8PAv+zMGb7KCfqIIr/BSCDYGhayfAGBVWW8x55Kvrl1zrDYw==} + engines: {node: '>= 16.0.0'} + + '@parcel/namer-default@2.13.3': + resolution: {integrity: sha512-A2a5A5fuyNcjSGOS0hPcdQmOE2kszZnLIXof7UMGNkNkeC62KAG8WcFZH5RNOY3LT5H773hq51zmc2Y2gE5Rnw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/node-resolver-core@3.4.3': + resolution: {integrity: sha512-IEnMks49egEic1ITBp59VQyHzkSQUXqpU9hOHwqN3KoSTdZ6rEgrXcS3pa6tdXay4NYGlcZ88kFCE8i/xYoVCg==} + engines: {node: '>= 16.0.0'} + + '@parcel/optimizer-css@2.13.3': + resolution: {integrity: sha512-A8o9IVCv919vhv69SkLmyW2WjJR5WZgcMqV6L1uiGF8i8z18myrMhrp2JuSHx29PRT9uNyzNC4Xrd4StYjIhJg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-htmlnano@2.13.3': + resolution: {integrity: sha512-K4Uvg0Sy2pECP7pdvvbud++F0pfcbNkq+IxTrgqBX5HJnLEmRZwgdvZEKF43oMEolclMnURMQRGjRplRaPdbXg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-image@2.13.3': + resolution: {integrity: sha512-wlDUICA29J4UnqkKrWiyt68g1e85qfYhp4zJFcFJL0LX1qqh1QwsLUz3YJ+KlruoqPxJSFEC8ncBEKiVCsqhEQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/optimizer-svgo@2.13.3': + resolution: {integrity: sha512-piIKxQKzhZK54dJR6yqIcq+urZmpsfgUpLCZT3cnWlX4ux5+S2iN66qqZBs0zVn+a58LcWcoP4Z9ieiJmpiu2w==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/optimizer-swc@2.13.3': + resolution: {integrity: sha512-zNSq6oWqLlW8ksPIDjM0VgrK6ZAJbPQCDvs1V+p0oX3CzEe85lT5VkRpnfrN1+/vvEJNGL8e60efHKpI+rXGTA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/package-manager@2.13.3': + resolution: {integrity: sha512-FLNI5OrZxymGf/Yln0E/kjnGn5sdkQAxW7pQVdtuM+5VeN75yibJRjsSGv88PvJ+KvpD2ANgiIJo1RufmoPcww==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/packager-css@2.13.3': + resolution: {integrity: sha512-ghDqRMtrUwaDERzFm9le0uz2PTeqqsjsW0ihQSZPSAptElRl9o5BR+XtMPv3r7Ui0evo+w35gD55oQCJ28vCig==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-html@2.13.3': + resolution: {integrity: sha512-jDLnKSA/EzVEZ3/aegXO3QJ/Ij732AgBBkIQfeC8tUoxwVz5b3HiPBAjVjcUSfZs7mdBSHO+ELWC3UD+HbsIrQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-js@2.13.3': + resolution: {integrity: sha512-0pMHHf2zOn7EOJe88QJw5h/wcV1bFfj6cXVcE55Wa8GX3V+SdCgolnlvNuBcRQ1Tlx0Xkpo+9hMFVIQbNQY6zw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-raw@2.13.3': + resolution: {integrity: sha512-AWu4UB+akBdskzvT3KGVHIdacU9f7cI678DQQ1jKQuc9yZz5D0VFt3ocFBOmvDfEQDF0uH3jjtJR7fnuvX7Biw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-svg@2.13.3': + resolution: {integrity: sha512-tKGRiFq/4jh5u2xpTstNQ7gu+RuZWzlWqpw5NaFmcKe6VQe5CMcS499xTFoREAGnRvevSeIgC38X1a+VOo+/AA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/packager-wasm@2.13.3': + resolution: {integrity: sha512-SZB56/b230vFrSehVXaUAWjJmWYc89gzb8OTLkBm7uvtFtov2J1R8Ig9TTJwinyXE3h84MCFP/YpQElSfoLkJw==} + engines: {node: '>=16.0.0', parcel: ^2.13.3} + + '@parcel/plugin@2.13.3': + resolution: {integrity: sha512-cterKHHcwg6q11Gpif/aqvHo056TR+yDVJ3fSdiG2xr5KD1VZ2B3hmofWERNNwjMcnR1h9Xq40B7jCKUhOyNFA==} + engines: {node: '>= 16.0.0'} + + '@parcel/profiler@2.13.3': + resolution: {integrity: sha512-ok6BwWSLvyHe5TuSXjSacYnDStFgP5Y30tA9mbtWSm0INDsYf+m5DqzpYPx8U54OaywWMK8w3MXUClosJX3aPA==} + engines: {node: '>= 16.0.0'} + + '@parcel/reporter-cli@2.13.3': + resolution: {integrity: sha512-EA5tKt/6bXYNMEavSs35qHlFdx6cZmRazlZxPBgxPePQYoouNAPMNLUOEQozaPhz9f5fvNDN7EHOFaAWcdO2LA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/reporter-dev-server@2.13.3': + resolution: {integrity: sha512-ZNeFp6AOIQFv7mZIv2P5O188dnZHNg0ymeDVcakfZomwhpSva2dFNS3AnvWo4eyWBlUxkmQO8BtaxeWTs7jAuA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/reporter-tracer@2.13.3': + resolution: {integrity: sha512-aBsVPI8jLZTDkFYrI69GxnsdvZKEYerkPsu935LcX9rfUYssOnmmUP+3oI+8fbg+qNjJuk9BgoQ4hCp9FOphMQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/resolver-default@2.13.3': + resolution: {integrity: sha512-urBZuRALWT9pFMeWQ8JirchLmsQEyI9lrJptiwLbJWrwvmlwSUGkcstmPwoNRf/aAQjICB7ser/247Vny0pFxA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-browser-hmr@2.13.3': + resolution: {integrity: sha512-EAcPojQFUNUGUrDk66cu3ySPO0NXRVS5CKPd4QrxPCVVbGzde4koKu8krC/TaGsoyUqhie8HMnS70qBP0GFfcQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-js@2.13.3': + resolution: {integrity: sha512-62OucNAnxb2Q0uyTFWW/0Hvv2DJ4b5H6neh/YFu2/wmxaZ37xTpEuEcG2do7KW54xE5DeLP+RliHLwi4NvR3ww==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-react-refresh@2.13.3': + resolution: {integrity: sha512-PYZ1klpJVwqE3WuifILjtF1dugtesHEuJcXYZI85T6UoRSD5ctS1nAIpZzT14Ga1lRt/jd+eAmhWL1l3m/Vk1Q==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/runtime-service-worker@2.13.3': + resolution: {integrity: sha512-BjMhPuT7Us1+YIo31exPRwomPiL+jrZZS5UUAwlEW2XGHDceEotzRM94LwxeFliCScT4IOokGoxixm19qRuzWg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/rust@2.13.3': + resolution: {integrity: sha512-dLq85xDAtzr3P5200cvxk+8WXSWauYbxuev9LCPdwfhlaWo/JEj6cu9seVdWlkagjGwkoV1kXC+GGntgUXOLAQ==} + engines: {node: '>= 16.0.0'} + + '@parcel/source-map@2.1.1': + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + + '@parcel/transformer-babel@2.13.3': + resolution: {integrity: sha512-ikzK9f5WTFrdQsPitQgjCPH6HmVU8AQPRemIJ2BndYhtodn5PQut5cnSvTrqax8RjYvheEKCQk/Zb/uR7qgS3g==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-css@2.13.3': + resolution: {integrity: sha512-zbrNURGph6JeVADbGydyZ7lcu/izj41kDxQ9xw4RPRW/3rofQiTU0OTREi+uBWiMENQySXVivEdzHA9cA+aLAA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-html@2.13.3': + resolution: {integrity: sha512-Yf74FkL9RCCB4+hxQRVMNQThH9+fZ5w0NLiQPpWUOcgDEEyxTi4FWPQgEBsKl/XK2ehdydbQB9fBgPQLuQxwPg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-image@2.13.3': + resolution: {integrity: sha512-wL1CXyeFAqbp2wcEq/JD3a/tbAyVIDMTC6laQxlIwnVV7dsENhK1qRuJZuoBdixESeUpFQSmmQvDIhcfT/cUUg==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/transformer-inline-string@2.13.3': + resolution: {integrity: sha512-xxFCpY9NKJJ05tECb6nYjswAg0SDccuVeGTuNNXBOSMT2UPSAFZdjVYLjXOiKV417ffJ36ZqLkHDluxNoN++yA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-js@2.13.3': + resolution: {integrity: sha512-KqfNGn1IHzDoN2aPqt4nDksgb50Xzcny777C7A7hjlQ3cmkjyJrixYjzzsPaPSGJ+kJpknh3KE8unkQ9mhFvRQ==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@parcel/transformer-json@2.13.3': + resolution: {integrity: sha512-rrq0ab6J0w9ePtsxi0kAvpCmrUYXXAx1Z5PATZakv89rSYbHBKEdXxyCoKFui/UPVCUEGVs5r0iOFepdHpIyeA==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-postcss@2.13.3': + resolution: {integrity: sha512-AIiWpU0QSFBrPcYIqAnhqB8RGE6yHFznnxztfg1t2zMSOnK3xoU6xqYKv8H/MduShGGrC3qVOeDfM8MUwzL3cw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-posthtml@2.13.3': + resolution: {integrity: sha512-5GSLyccpHASwFAu3uJ83gDIBSvfsGdVmhJvy0Vxe+K1Fklk2ibhvvtUHMhB7mg6SPHC+R9jsNc3ZqY04ZLeGjw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-raw@2.13.3': + resolution: {integrity: sha512-BFsAbdQF0l8/Pdb7dSLJeYcd8jgwvAUbHgMink2MNXJuRUvDl19Gns8jVokU+uraFHulJMBj40+K/RTd33in4g==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-react-refresh-wrap@2.13.3': + resolution: {integrity: sha512-mOof4cRyxsZRdg8kkWaFtaX98mHpxUhcGPU+nF9RQVa9q737ItxrorsPNR9hpZAyE2TtFNflNW7RoYsgvlLw8w==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/transformer-svg@2.13.3': + resolution: {integrity: sha512-9jm7ZF4KHIrGLWlw/SFUz5KKJ20nxHvjFAmzde34R9Wu+F1BOjLZxae7w4ZRwvIc+UVOUcBBQFmhSVwVDZg6Dw==} + engines: {node: '>= 16.0.0', parcel: ^2.13.3} + + '@parcel/types-internal@2.13.3': + resolution: {integrity: sha512-Lhx0n+9RCp+Ipktf/I+CLm3zE9Iq9NtDd8b2Vr5lVWyoT8AbzBKIHIpTbhLS4kjZ80L3I6o93OYjqAaIjsqoZw==} + + '@parcel/types@2.13.3': + resolution: {integrity: sha512-+RpFHxx8fy8/dpuehHUw/ja9PRExC3wJoIlIIF42E7SLu2SvlTHtKm6EfICZzxCXNEBzjoDbamCRcN0nmTPlhw==} + + '@parcel/utils@2.13.3': + resolution: {integrity: sha512-yxY9xw2wOUlJaScOXYZmMGoZ4Ck4Kqj+p6Koe5kLkkWM1j98Q0Dj2tf/mNvZi4yrdnlm+dclCwNRnuE8Q9D+pw==} + engines: {node: '>= 16.0.0'} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@parcel/workers@2.13.3': + resolution: {integrity: sha512-oAHmdniWTRwwwsKbcF4t3VjOtKN+/W17Wj5laiYB+HLkfsjGTfIQPj3sdXmrlBAGpI4omIcvR70PHHXnfdTfwA==} + engines: {node: '>= 16.0.0'} + peerDependencies: + '@parcel/core': ^2.13.3 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@swc/core-darwin-arm64@1.10.14': + resolution: {integrity: sha512-Dh4VyrhDDb05tdRmqJ/MucOPMTnrB4pRJol18HVyLlqu1HOT5EzonUniNTCdQbUXjgdv5UVJSTE1lYTzrp+myA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.10.14': + resolution: {integrity: sha512-KpzotL/I0O12RE3tF8NmQErINv0cQe/0mnN/Q50ESFzB5kU6bLgp2HMnnwDTm/XEZZRJCNe0oc9WJ5rKbAJFRQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.10.14': + resolution: {integrity: sha512-20yRXZjMJVz1wp1TcscKiGTVXistG+saIaxOmxSNQia1Qun3hSWLL+u6+5kXbfYGr7R2N6kqSwtZbIfJI25r9Q==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.10.14': + resolution: {integrity: sha512-Gy7cGrNkiMfPxQyLGxdgXPwyWzNzbHuWycJFcoKBihxZKZIW8hkPBttkGivuLC+0qOgsV2/U+S7tlvAju7FtmQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.10.14': + resolution: {integrity: sha512-+oYVqJvFw62InZ8PIy1rBACJPC2WTe4vbVb9kM1jJj2D7dKLm9acnnYIVIDsM5Wo7Uab8RvPHXVbs19IBurzuw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.10.14': + resolution: {integrity: sha512-OmEbVEKQFLQVHwo4EJl9osmlulURy46k232Opfpn/1ji0t2KcNCci3POsnfMuoZjLkGJv8vGNJdPQxX+CP+wSA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.10.14': + resolution: {integrity: sha512-OZW+Icm8DMPqHbhdxplkuG8qrNnPk5i7xJOZWYi1y5bTjgGFI4nEzrsmmeHKMdQTaWwsFrm3uK1rlyQ48MmXmg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.10.14': + resolution: {integrity: sha512-sTvc+xrDQXy3HXZFtTEClY35Efvuc3D+busYm0+rb1+Thau4HLRY9WP+sOKeGwH9/16rzfzYEqD7Ds8A9ykrHw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.10.14': + resolution: {integrity: sha512-j2iQ4y9GWTKtES5eMU0sDsFdYni7IxME7ejFej25Tv3Fq4B+U9tgtYWlJwh1858nIWDXelHiKcSh/UICAyVMdQ==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.10.14': + resolution: {integrity: sha512-TYtWkUSMkjs0jGPeWdtWbex4B+DlQZmN/ySVLiPI+EltYCLEXsFMkVFq6aWn48dqFHggFK0UYfvDrJUR2c3Qxg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.10.14': + resolution: {integrity: sha512-WSrnE6JRnH20ZYjOOgSS4aOaPv9gxlkI2KRkN24kagbZnPZMnN8bZZyzw1rrLvwgpuRGv17Uz+hflosbR+SP6w==} + 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.17': + resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dotenv-expand@11.0.7: + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} + + dotenv@16.4.7: + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.91: + resolution: {integrity: sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + for-each@0.3.4: + resolution: {integrity: sha512-kKaIINnFpzW6ffJNDjjyjrk21BkDx38c0xa/klsT8VzLCaMEefv4ZTacrcVR4DmgTeBra++jMDAfS/tS799YDw==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-port@4.2.0: + resolution: {integrity: sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==} + engines: {node: '>=6'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + htmlnano@2.1.1: + resolution: {integrity: sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==} + peerDependencies: + cssnano: ^7.0.0 + postcss: ^8.3.11 + purgecss: ^6.0.0 + relateurl: ^0.2.7 + srcset: 5.0.1 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + + htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + + htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lightningcss-darwin-arm64@1.29.1: + resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.29.1: + resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.29.1: + resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.29.1: + resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.29.1: + resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.29.1: + resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.29.1: + resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.29.1: + resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.29.1: + resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.29.1: + resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.29.1: + resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} + engines: {node: '>= 12.0.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lmdb@2.8.5: + resolution: {integrity: sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==} + hasBin: true + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.2: + resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + + neuroglancer@file:../../..: + resolution: {directory: ../../.., type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + ordered-binary@1.5.3: + resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parcel-namer-rewrite@2.10.3-rc.2: + resolution: {integrity: sha512-vn49fDbgQTjp+GX8hsa5LxQOkqo9o5uOTr86FbG2QrbZMo4ct1j/X2ZCe1LijLCgugVDebAHI6eooKlfAUirRQ==} + engines: {node: '>= 10.0.0', parcel: ^2.10.3} + + parcel@2.13.3: + resolution: {integrity: sha512-8GrC8C7J8mwRpAlk7EJ7lwdFTbCN+dcXH2gy5AsEs9pLfzo9wvxOTx6W0fzSlvCOvZOita+8GdfYlGfEt0tRgA==} + engines: {node: '>= 16.0.0'} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + + posthtml-parser@0.12.1: + resolution: {integrity: sha512-rYFmsDLfYm+4Ts2Oh4DCDSZPtdC1BLnRXAobypVzX9alj28KGl65dIFtgDY9zB57D0TC4Qxqrawuq/2et1P0GA==} + engines: {node: '>=16'} + + posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + + posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/helper-validator-identifier@7.25.9': {} + + '@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 + + '@lezer/common@1.2.3': {} + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@lmdb/lmdb-darwin-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-darwin-x64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm64@2.8.5': + optional: true + + '@lmdb/lmdb-linux-arm@2.8.5': + optional: true + + '@lmdb/lmdb-linux-x64@2.8.5': + optional: true + + '@lmdb/lmdb-win32-x64@2.8.5': + optional: true + + '@mischnic/json-sourcemap@0.1.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/lr': 1.4.2 + json5: 2.2.3 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@one-ini/wasm@0.1.1': {} + + '@parcel/bundler-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/graph': 3.3.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/cache@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/utils': 2.13.3 + lmdb: 2.8.5 + + '@parcel/codeframe@2.13.3': + dependencies: + chalk: 4.1.2 + + '@parcel/compressor-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/config-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/bundler-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/compressor-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/namer-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-htmlnano': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-image': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-svgo': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/optimizer-swc': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/packager-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-html': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-svg': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/packager-wasm': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/resolver-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-browser-hmr': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-react-refresh': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/runtime-service-worker': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-babel': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-css': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-html': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-image': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-js': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-json': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-postcss': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-posthtml': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-raw': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-react-refresh-wrap': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/transformer-svg': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + '@parcel/core@2.13.3(@swc/helpers@0.5.15)': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/graph': 3.3.3 + '@parcel/logger': 2.13.3 + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/profiler': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + base-x: 3.0.10 + browserslist: 4.24.4 + clone: 2.1.2 + dotenv: 16.4.7 + dotenv-expand: 11.0.7 + json5: 2.2.3 + msgpackr: 1.11.2 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@swc/helpers' + + '@parcel/diagnostic@2.13.3': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + + '@parcel/events@2.13.3': {} + + '@parcel/feature-flags@2.13.3': {} + + '@parcel/fs@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/feature-flags': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/types-internal': 2.13.3 + '@parcel/utils': 2.13.3 + '@parcel/watcher': 2.5.1 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + + '@parcel/graph@3.3.3': + dependencies: + '@parcel/feature-flags': 2.13.3 + nullthrows: 1.1.1 + + '@parcel/logger@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + + '@parcel/markdown-ansi@2.13.3': + dependencies: + chalk: 4.1.2 + + '@parcel/namer-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/node-resolver-core@3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-htmlnano@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + htmlnano: 2.1.1 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + '@parcel/optimizer-image@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + + '@parcel/optimizer-svgo@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-swc@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + '@swc/core': 1.10.14(@swc/helpers@0.5.15) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + + '@parcel/package-manager@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/node-resolver-core': 3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@swc/core': 1.10.14(@swc/helpers@0.5.15) + semver: 7.7.1 + transitivePeerDependencies: + - '@swc/helpers' + + '@parcel/packager-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-html@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-svg@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-wasm@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/plugin@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/profiler@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/types-internal': 2.13.3 + chrome-trace-event: 1.0.4 + + '@parcel/reporter-cli@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/reporter-dev-server@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/reporter-tracer@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chrome-trace-event: 1.0.4 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/resolver-default@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/node-resolver-core': 3.4.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-browser-hmr@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-react-refresh@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + react-error-overlay: 6.0.9 + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-service-worker@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/rust@2.13.3': {} + + '@parcel/source-map@2.1.1': + dependencies: + detect-libc: 1.0.3 + + '@parcel/transformer-babel@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-css@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + browserslist: 4.24.4 + lightningcss: 1.29.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-html@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-image@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + nullthrows: 1.1.1 + + '@parcel/transformer-inline-string@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-js@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@swc/helpers': 0.5.15 + browserslist: 4.24.4 + nullthrows: 1.1.1 + regenerator-runtime: 0.14.1 + semver: 7.7.1 + + '@parcel/transformer-json@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-postcss@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + '@parcel/utils': 2.13.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-posthtml@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-raw@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-react-refresh-wrap@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + react-refresh: 0.14.2 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-svg@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/rust': 2.13.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.12.1 + posthtml-render: 3.0.0 + semver: 7.7.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/types-internal@2.13.3': + dependencies: + '@parcel/diagnostic': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/source-map': 2.1.1 + utility-types: 3.11.0 + + '@parcel/types@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/types-internal': 2.13.3 + '@parcel/workers': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/utils@2.13.3': + dependencies: + '@parcel/codeframe': 2.13.3 + '@parcel/diagnostic': 2.13.3 + '@parcel/logger': 2.13.3 + '@parcel/markdown-ansi': 2.13.3 + '@parcel/rust': 2.13.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + + '@parcel/workers@2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))': + dependencies: + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/logger': 2.13.3 + '@parcel/profiler': 2.13.3 + '@parcel/types-internal': 2.13.3 + '@parcel/utils': 2.13.3 + nullthrows: 1.1.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@swc/core-darwin-arm64@1.10.14': + optional: true + + '@swc/core-darwin-x64@1.10.14': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.10.14': + optional: true + + '@swc/core-linux-arm64-gnu@1.10.14': + optional: true + + '@swc/core-linux-arm64-musl@1.10.14': + optional: true + + '@swc/core-linux-x64-gnu@1.10.14': + optional: true + + '@swc/core-linux-x64-musl@1.10.14': + optional: true + + '@swc/core-win32-arm64-msvc@1.10.14': + optional: true + + '@swc/core-win32-ia32-msvc@1.10.14': + optional: true + + '@swc/core-win32-x64-msvc@1.10.14': + optional: true + + '@swc/core@1.10.14(@swc/helpers@0.5.15)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.17 + optionalDependencies: + '@swc/core-darwin-arm64': 1.10.14 + '@swc/core-darwin-x64': 1.10.14 + '@swc/core-linux-arm-gnueabihf': 1.10.14 + '@swc/core-linux-arm64-gnu': 1.10.14 + '@swc/core-linux-arm64-musl': 1.10.14 + '@swc/core-linux-x64-gnu': 1.10.14 + '@swc/core-linux-x64-musl': 1.10.14 + '@swc/core-win32-arm64-msvc': 1.10.14 + '@swc/core-win32-ia32-msvc': 1.10.14 + '@swc/core-win32-x64-msvc': 1.10.14 + '@swc/helpers': 0.5.15 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.17': + dependencies: + '@swc/counter': 0.1.3 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + argparse@2.0.1: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + assert@2.1.0: + dependencies: + call-bind: 1.0.8 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.7 + util: 0.12.5 + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.91 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.7 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chrome-trace-event@1.0.4: {} + + clone@2.1.2: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + cosmiconfig@9.0.0: + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv-expand@11.0.7: + dependencies: + dotenv: 16.4.7 + + dotenv@16.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + electron-to-chromium@1.5.91: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@2.2.0: {} + + entities@3.0.1: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + for-each@0.3.4: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + function-bind@1.1.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-port@4.2.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + gopd@1.2.0: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + htmlnano@2.1.1: + dependencies: + cosmiconfig: 9.0.0 + posthtml: 0.16.6 + timsort: 0.3.0 + transitivePeerDependencies: + - typescript + + htmlparser2@7.2.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + + htmlparser2@9.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.2 + entities: 4.5.0 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + is-arguments@1.2.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-arrayish@0.2.1: {} + + is-buffer@1.1.6: {} + + is-callable@1.2.7: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-json@2.0.1: {} + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lightningcss-darwin-arm64@1.29.1: + optional: true + + lightningcss-darwin-x64@1.29.1: + optional: true + + lightningcss-freebsd-x64@1.29.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.29.1: + optional: true + + lightningcss-linux-arm64-gnu@1.29.1: + optional: true + + lightningcss-linux-arm64-musl@1.29.1: + optional: true + + lightningcss-linux-x64-gnu@1.29.1: + optional: true + + lightningcss-linux-x64-musl@1.29.1: + optional: true + + lightningcss-win32-arm64-msvc@1.29.1: + optional: true + + lightningcss-win32-x64-msvc@1.29.1: + optional: true + + lightningcss@1.29.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.29.1 + lightningcss-darwin-x64: 1.29.1 + lightningcss-freebsd-x64: 1.29.1 + lightningcss-linux-arm-gnueabihf: 1.29.1 + lightningcss-linux-arm64-gnu: 1.29.1 + lightningcss-linux-arm64-musl: 1.29.1 + lightningcss-linux-x64-gnu: 1.29.1 + lightningcss-linux-x64-musl: 1.29.1 + lightningcss-win32-arm64-msvc: 1.29.1 + lightningcss-win32-x64-msvc: 1.29.1 + + lines-and-columns@1.2.4: {} + + lmdb@2.8.5: + dependencies: + msgpackr: 1.11.2 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.1.1 + ordered-binary: 1.5.3 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.8.5 + '@lmdb/lmdb-darwin-x64': 2.8.5 + '@lmdb/lmdb-linux-arm': 2.8.5 + '@lmdb/lmdb-linux-arm64': 2.8.5 + '@lmdb/lmdb-linux-x64': 2.8.5 + '@lmdb/lmdb-win32-x64': 2.8.5 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.2: + optionalDependencies: + msgpackr-extract: 3.0.3 + + neuroglancer@file:../../..: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + node-addon-api@6.1.0: {} + + node-addon-api@7.1.1: {} + + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.0.3 + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + optional: true + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + nullthrows@1.1.1: {} + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + ordered-binary@1.5.3: {} + + package-json-from-dist@1.0.1: {} + + parcel-namer-rewrite@2.10.3-rc.2(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15): + dependencies: + '@parcel/logger': 2.13.3 + '@parcel/namer-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/plugin': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/types': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + assert: 2.1.0 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + + parcel@2.13.3(@swc/helpers@0.5.15): + dependencies: + '@parcel/config-default': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/core': 2.13.3(@swc/helpers@0.5.15) + '@parcel/diagnostic': 2.13.3 + '@parcel/events': 2.13.3 + '@parcel/feature-flags': 2.13.3 + '@parcel/fs': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/logger': 2.13.3 + '@parcel/package-manager': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) + '@parcel/reporter-cli': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-dev-server': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/reporter-tracer': 2.13.3(@parcel/core@2.13.3(@swc/helpers@0.5.15)) + '@parcel/utils': 2.13.3 + chalk: 4.1.2 + commander: 12.1.0 + get-port: 4.2.0 + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - svgo + - terser + - typescript + - uncss + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pn@1.1.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + posthtml-parser@0.11.0: + dependencies: + htmlparser2: 7.2.0 + + posthtml-parser@0.12.1: + dependencies: + htmlparser2: 9.1.0 + + posthtml-render@3.0.0: + dependencies: + is-json: 2.0.1 + + posthtml@0.16.6: + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + react-error-overlay@6.0.9: {} + + react-refresh@0.14.2: {} + + regenerator-runtime@0.14.1: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + resolve-from@4.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.7 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map@0.6.1: + optional: true + + srcset@4.0.0: {} + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + symbol-tree@3.2.4: {} + + term-size@2.2.1: {} + + timsort@0.3.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-fest@0.20.2: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.0 + is-typed-array: 1.1.15 + which-typed-array: 1.1.18 + + utility-types@3.11.0: {} + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + weak-lru-cache@1.2.2: {} + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/rsbuild/rsbuild-project-built/.gitignore b/examples/rsbuild/rsbuild-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rsbuild/rsbuild-project-built/README.md b/examples/rsbuild/rsbuild-project-built/README.md new file mode 100644 index 0000000000..be1275aabe --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses rsbuild for building. diff --git a/examples/rsbuild/rsbuild-project-built/package-lock.json b/examples/rsbuild/rsbuild-project-built/package-lock.json new file mode 100644 index 0000000000..e2ce3e2b34 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/package-lock.json @@ -0,0 +1,307 @@ +{ + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "@rsbuild/core": "^1.1.9" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "@playwright/test": "^1.50.1", + "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", + "gl-matrix": "3.1.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@rsbuild/core": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.1.9.tgz", + "integrity": "sha512-mHZveEwlTtW9nxWa+T0xUm6ssm+HkDYZ0NENLfWMUmsL0LjMJrpQzRlbD+p5+9Uf+KXUo3Dbtv0ScA+p7cuGTg==", + "dev": true, + "dependencies": { + "@rspack/core": "~1.1.5", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.15", + "core-js": "~3.39.0" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=16.7.0" + } + }, + "node_modules/@rspack/binding": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", + "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.6", + "@rspack/binding-darwin-x64": "1.1.6", + "@rspack/binding-linux-arm64-gnu": "1.1.6", + "@rspack/binding-linux-arm64-musl": "1.1.6", + "@rspack/binding-linux-x64-gnu": "1.1.6", + "@rspack/binding-linux-x64-musl": "1.1.6", + "@rspack/binding-win32-arm64-msvc": "1.1.6", + "@rspack/binding-win32-ia32-msvc": "1.1.6", + "@rspack/binding-win32-x64-msvc": "1.1.6" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", + "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", + "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", + "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", + "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", + "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", + "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", + "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", + "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", + "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", + "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.6", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } +} diff --git a/examples/rsbuild/rsbuild-project-built/package.json b/examples/rsbuild/rsbuild-project-built/package.json new file mode 100644 index 0000000000..f7bedd282c --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/package.json @@ -0,0 +1,23 @@ +{ + "name": "neuroglancer-rsbuild-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of an rsbuild project that depends on Neuroglancer.", + "scripts": { + "build": "rsbuild build", + "dev-server": "rsbuild dev" + }, + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rsbuild/core": "^1.1.9" + }, + "type": "module" +} diff --git a/examples/rsbuild/rsbuild-project-built/pnpm-lock.yaml b/examples/rsbuild/rsbuild-project-built/pnpm-lock.yaml new file mode 100644 index 0000000000..8a6ee29e83 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/pnpm-lock.yaml @@ -0,0 +1,1409 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../../dist/package + version: file:../../../dist/package + devDependencies: + '@rsbuild/core': + specifier: ^1.1.9 + version: 1.2.3 + +packages: + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rsbuild/core@1.2.3': + resolution: {integrity: sha512-lUCt8gQe9E2PI3srcEJ1Na3GQYmsYuvAqK0f/k00HM0pEjrbOFC9Xq2kR85UoXHFqlTCIw/fLLDe91PKRCbKAw==} + engines: {node: '>=16.7.0'} + hasBin: true + + '@rspack/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.2.2': + resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.2.2': + resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + + '@rspack/core@1.2.2': + resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} + 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/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + 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'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + neuroglancer@file:../../../dist/package: + resolution: {directory: ../../../dist/package, type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@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 + + '@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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rsbuild/core@1.2.3': + dependencies: + '@rspack/core': 1.2.2(@swc/helpers@0.5.15) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.15 + core-js: 3.40.0 + transitivePeerDependencies: + - '@rspack/tracing' + + '@rspack/binding-darwin-arm64@1.2.2': + optional: true + + '@rspack/binding-darwin-x64@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-musl@1.2.2': + optional: true + + '@rspack/binding-linux-x64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-x64-musl@1.2.2': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-x64-msvc@1.2.2': + optional: true + + '@rspack/binding@1.2.2': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.2.2 + '@rspack/binding-darwin-x64': 1.2.2 + '@rspack/binding-linux-arm64-gnu': 1.2.2 + '@rspack/binding-linux-arm64-musl': 1.2.2 + '@rspack/binding-linux-x64-gnu': 1.2.2 + '@rspack/binding-linux-x64-musl': 1.2.2 + '@rspack/binding-win32-arm64-msvc': 1.2.2 + '@rspack/binding-win32-ia32-msvc': 1.2.2 + '@rspack/binding-win32-x64-msvc': 1.2.2 + + '@rspack/core@1.2.2(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.8.4 + '@rspack/binding': 1.2.2 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001697 + optionalDependencies: + '@swc/helpers': 0.5.15 + + '@rspack/lite-tapable@1.0.1': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browser-process-hrtime@1.0.0: {} + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ini@1.3.8: {} + + is-buffer@1.1.6: {} + + is-extendable@0.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isomorphic-rslog@0.0.6: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + neuroglancer@file:../../../dist/package: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + pn@1.1.0: {} + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map@0.6.1: + optional: true + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + symbol-tree@3.2.4: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts b/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts new file mode 100644 index 0000000000..0470a52888 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/rsbuild.config.ts @@ -0,0 +1,45 @@ +import { defineConfig } from "@rsbuild/core"; + +export default defineConfig({ + html: { + title: "rsbuild neuroglancer test", + scriptLoading: "module", + mountId: "neuroglancer-container", + }, + output: { + // By default, running the dev-server also clears the dist directory. + cleanDistPath: process.env.NODE_ENV === "production", + assetPrefix: "./", + distPath: { + js: "", + jsAsync: "", + wasm: "", + css: "", + }, + }, + tools: { + rspack: { + module: { + rules: [ + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + }, + }, + plugins: [], +}); diff --git a/examples/rsbuild/rsbuild-project-built/src/index.js b/examples/rsbuild/rsbuild-project-built/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rsbuild/rsbuild-project-source/.gitignore b/examples/rsbuild/rsbuild-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rsbuild/rsbuild-project-source/README.md b/examples/rsbuild/rsbuild-project-source/README.md new file mode 100644 index 0000000000..be1275aabe --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses rsbuild for building. diff --git a/examples/rsbuild/rsbuild-project-source/package-lock.json b/examples/rsbuild/rsbuild-project-source/package-lock.json new file mode 100644 index 0000000000..f9c706524f --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/package-lock.json @@ -0,0 +1,10284 @@ +{ + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "@rsbuild/core": "^1.1.9" + } + }, + "../../..": { + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "@playwright/test": "^1.50.1", + "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", + "gl-matrix": "3.1.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.10.7", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", + "css-loader": "^7.1.2", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", + "playwright": "^1.49.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" + }, + "engines": { + "node": ">=22" + } + }, + "../../../node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "../../../node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "../../../node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "../../../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../../../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../../../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@one-ini/wasm": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/@polka/url": { + "version": "1.0.0-next.24", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@puppeteer/browsers": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@sindresorhus/is": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "../../../node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/codemirror": { + "version": "5.60.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "../../../node_modules/@types/eslint": { + "version": "8.56.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../../../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../../../node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/gl-matrix": { + "version": "2.4.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash-es": { + "version": "4.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "../../../node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../../../node_modules/@types/tern": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "../../../node_modules/@types/which": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "../../../node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "../../../node_modules/@vitest/expect": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/snapshot": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/spy": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/ui": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "../../../node_modules/@vitest/utils": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "../../../node_modules/@wdio/config": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger": { + "version": "8.28.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@wdio/protocols": { + "version": "8.32.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@wdio/repl": { + "version": "8.24.12", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/types": { + "version": "8.32.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/utils": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../../../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "../../../node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "../../../node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "../../../node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "../../../node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "../../../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/archiver": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/archiver-utils/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "../../../node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "../../../node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array-equal": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "../../../node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/async": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/async-limiter": { + "version": "1.0.1", + "license": "MIT" + }, + "../../../node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../../../node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/aws4": { + "version": "1.12.0", + "license": "MIT" + }, + "../../../node_modules/b4a": { + "version": "1.6.4", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/bare-events": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/bare-fs": { + "version": "2.1.5", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "../../../node_modules/bare-os": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/bare-path": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "../../../node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/basic-ftp": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "../../../node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/binary": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "../../../node_modules/bluebird": { + "version": "3.4.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../../../node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "../../../node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/buffers": { + "version": "0.1.1", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.2.0" + } + }, + "../../../node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request": { + "version": "10.2.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/call-bind": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/caniuse-lite": { + "version": "1.0.30001596", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "optional": true, + "peer": true + }, + "../../../node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "../../../node_modules/chai": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/chainsaw": { + "version": "0.1.0", + "dev": true, + "license": "MIT/X11", + "optional": true, + "peer": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + } + }, + "../../../node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "../../../node_modules/chromium-bidi": { + "version": "0.4.16", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "../../../node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/codemirror": { + "version": "5.65.16", + "license": "MIT" + }, + "../../../node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../../../node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "../../../node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "../../../node_modules/compress-commons": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/condense-newlines": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "../../../node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "../../../node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/crc-32": { + "version": "1.2.2", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/crc32-stream": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/cross-fetch": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "../../../node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "../../../node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "../../../node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/css-loader": { + "version": "6.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/css-shorthand-properties": { + "version": "1.1.1", + "dev": true, + "optional": true, + "peer": true + }, + "../../../node_modules/css-value": { + "version": "0.0.1", + "dev": true, + "optional": true, + "peer": true + }, + "../../../node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../../../node_modules/decamelize": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/define-data-property": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/devtools-protocol": { + "version": "0.0.1262051", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "../../../node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "../../../node_modules/edge-paths": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "../../../node_modules/edgedriver": { + "version": "5.3.10", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "../../../node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/editorconfig": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/electron-to-chromium": { + "version": "1.4.699", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "../../../node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "../../../node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../../../node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/esbuild": { + "version": "0.20.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "../../../node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "../../../node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "../../../node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "../../../node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/npm-run-path": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../../../node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "../../../node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "../../../node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "../../../node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "../../../node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "../../../node_modules/fastq": { + "version": "1.17.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "../../../node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "../../../node_modules/fetch-blob": { + "version": "3.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "../../../node_modules/fflate": { + "version": "0.8.1", + "license": "MIT" + }, + "../../../node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "../../../node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.17" + } + }, + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "../../../node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "../../../node_modules/fstream": { + "version": "1.0.12", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/fstream/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fstream/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fstream/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "../../../node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/geckodriver": { + "version": "4.3.3", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.5", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "../../../node_modules/geckodriver/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "../../../node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/get-intrinsic": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-port": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-tsconfig": { + "version": "4.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "../../../node_modules/get-uri": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "../../../node_modules/gl-matrix": { + "version": "3.1.0", + "license": "MIT" + }, + "../../../node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "../../../node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/has-property-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "../../../node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "../../../node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/ikonate": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" + } + }, + "../../../node_modules/ikonate/node_modules/abab": { + "version": "1.0.4", + "license": "ISC" + }, + "../../../node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-walk": { + "version": "6.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "license": "MIT", + "dependencies": { + "cssom": "0.3.x" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/domexception": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "license": "MIT", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "../../../node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-meta-resolve": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "../../../node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "../../../node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../../../node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "../../../node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../../../node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-plain-obj": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typed-array": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-whitespace": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "../../../node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "../../../node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "../../../node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/js-beautify": { + "version": "1.14.11", + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../../../node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/jsdom": { + "version": "17.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.4.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.0", + "decimal.js": "^10.3.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^9.0.0", + "ws": "^8.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../../../node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "../../../node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "../../../node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "../../../node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "../../../node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "../../../node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "../../../node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/ky": { + "version": "0.33.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "../../../node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "../../../node_modules/left-pad": { + "version": "1.3.0", + "license": "WTFPL" + }, + "../../../node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/lightningcss": { + "version": "1.23.0", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "../../../node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/listenercount": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "../../../node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/locate-app": { + "version": "2.2.20", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, + "dependencies": { + "n12": "1.8.23", + "type-fest": "2.13.0", + "userhome": "1.0.0" + } + }, + "../../../node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash.clonedeep": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "../../../node_modules/lodash.zip": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/loglevel": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "../../../node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "../../../node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "../../../node_modules/magic-string": { + "version": "0.30.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../../../node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../../node_modules/mitt": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../../../node_modules/mlly": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "../../../node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/n12": { + "version": "1.8.23", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true + }, + "../../../node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "../../../node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/nifti-reader-js": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "fflate": "*" + } + }, + "../../../node_modules/node-domexception": { + "version": "1.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.5.0" + } + }, + "../../../node_modules/node-fetch": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "../../../node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/nopt": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/normalize-url": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/numcodecs": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "fflate": "^0.8.0" + } + }, + "../../../node_modules/nwmatcher": { + "version": "1.4.4", + "license": "MIT" + }, + "../../../node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "../../../node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../../../node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "../../../node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + } + }, + "../../../node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/pac-proxy-agent": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "../../../node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../../../node_modules/pkg-types": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "../../../node_modules/pn": { + "version": "1.1.0", + "license": "MIT" + }, + "../../../node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "../../../node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-scope": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../../node_modules/pretty": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "../../../node_modules/proxy-agent": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "../../../node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/puppeteer-core": { + "version": "20.9.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/queue-tick": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../../../node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../../../node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/readdir-glob": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "../../../node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/request-promise-core": { + "version": "1.1.4", + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native": { + "version": "1.0.9", + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "../../../node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "../../../node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/resq": { + "version": "1.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "../../../node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "../../../node_modules/rgb2hex": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/rollup": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "../../../node_modules/safaridriver": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "../../../node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "../../../node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/serialize-error": { + "version": "11.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../../../node_modules/set-function-length": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks": { + "version": "2.7.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks-proxy-agent": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../../../node_modules/split2": { + "version": "4.2.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.x" + } + }, + "../../../node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/sshpk": { + "version": "1.18.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/stealthy-require": { + "version": "1.1.1", + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/streamx": { + "version": "2.15.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "../../../node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-literal": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../../../node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tar-fs": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../../../node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../../../node_modules/terser": { + "version": "5.29.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../../../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/traverse": { + "version": "0.3.9", + "dev": true, + "license": "MIT/X11", + "optional": true, + "peer": true + }, + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../../../node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD", + "optional": true, + "peer": true + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "../../../node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "../../../node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../../node_modules/ufo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "../../../node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "../../../node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/unzipper": { + "version": "0.10.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "../../../node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "../../../node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "../../../node_modules/userhome": { + "version": "1.0.0", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "../../../node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "../../../node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/vite": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "../../../node_modules/vite-node": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "../../../node_modules/vitest": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "../../../node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/w3c-hr-time": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "../../../node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/wait-port": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/web-streams-polyfill": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/webdriver": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/webdriverio": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "archiver": "^6.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1262051", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.32.3" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "../../../node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "../../../node_modules/webpack": { + "version": "5.90.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "../../../node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/whatwg-encoding": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "../../../node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "../../../node_modules/whatwg-url": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/which-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/why-is-node-running": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "../../../node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/xmldom": { + "version": "0.1.31", + "license": "(LGPL-2.0 or MIT)", + "engines": { + "node": ">=0.1" + } + }, + "../../../node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "../../../node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "../../../node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/zip-stream": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@rsbuild/core": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@rsbuild/core/-/core-1.1.9.tgz", + "integrity": "sha512-mHZveEwlTtW9nxWa+T0xUm6ssm+HkDYZ0NENLfWMUmsL0LjMJrpQzRlbD+p5+9Uf+KXUo3Dbtv0ScA+p7cuGTg==", + "dev": true, + "dependencies": { + "@rspack/core": "~1.1.5", + "@rspack/lite-tapable": "~1.0.1", + "@swc/helpers": "^0.5.15", + "core-js": "~3.39.0" + }, + "bin": { + "rsbuild": "bin/rsbuild.js" + }, + "engines": { + "node": ">=16.7.0" + } + }, + "node_modules/@rspack/binding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", + "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.5", + "@rspack/binding-darwin-x64": "1.1.5", + "@rspack/binding-linux-arm64-gnu": "1.1.5", + "@rspack/binding-linux-arm64-musl": "1.1.5", + "@rspack/binding-linux-x64-gnu": "1.1.5", + "@rspack/binding-linux-x64-musl": "1.1.5", + "@rspack/binding-win32-arm64-msvc": "1.1.5", + "@rspack/binding-win32-ia32-msvc": "1.1.5", + "@rspack/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", + "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/core": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", + "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.5", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dev": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + } + } +} diff --git a/examples/rsbuild/rsbuild-project-source/package.json b/examples/rsbuild/rsbuild-project-source/package.json new file mode 100644 index 0000000000..ae76056a7f --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/package.json @@ -0,0 +1,23 @@ +{ + "name": "neuroglancer-rsbuild-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of an rsbuild project that depends on Neuroglancer.", + "scripts": { + "build": "rsbuild build", + "dev-server": "rsbuild dev" + }, + "dependencies": { + "neuroglancer": "file:../../.." + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rsbuild/core": "^1.1.9" + }, + "type": "module" +} diff --git a/examples/rsbuild/rsbuild-project-source/pnpm-lock.yaml b/examples/rsbuild/rsbuild-project-source/pnpm-lock.yaml new file mode 100644 index 0000000000..b481244247 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/pnpm-lock.yaml @@ -0,0 +1,1409 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../.. + version: file:../../.. + devDependencies: + '@rsbuild/core': + specifier: ^1.1.9 + version: 1.2.3 + +packages: + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rsbuild/core@1.2.3': + resolution: {integrity: sha512-lUCt8gQe9E2PI3srcEJ1Na3GQYmsYuvAqK0f/k00HM0pEjrbOFC9Xq2kR85UoXHFqlTCIw/fLLDe91PKRCbKAw==} + engines: {node: '>=16.7.0'} + hasBin: true + + '@rspack/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.2.2': + resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.2.2': + resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + + '@rspack/core@1.2.2': + resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} + 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/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + 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'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + neuroglancer@file:../../..: + resolution: {directory: ../../.., type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + 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'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@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 + + '@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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rsbuild/core@1.2.3': + dependencies: + '@rspack/core': 1.2.2(@swc/helpers@0.5.15) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.15 + core-js: 3.40.0 + transitivePeerDependencies: + - '@rspack/tracing' + + '@rspack/binding-darwin-arm64@1.2.2': + optional: true + + '@rspack/binding-darwin-x64@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-musl@1.2.2': + optional: true + + '@rspack/binding-linux-x64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-x64-musl@1.2.2': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-x64-msvc@1.2.2': + optional: true + + '@rspack/binding@1.2.2': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.2.2 + '@rspack/binding-darwin-x64': 1.2.2 + '@rspack/binding-linux-arm64-gnu': 1.2.2 + '@rspack/binding-linux-arm64-musl': 1.2.2 + '@rspack/binding-linux-x64-gnu': 1.2.2 + '@rspack/binding-linux-x64-musl': 1.2.2 + '@rspack/binding-win32-arm64-msvc': 1.2.2 + '@rspack/binding-win32-ia32-msvc': 1.2.2 + '@rspack/binding-win32-x64-msvc': 1.2.2 + + '@rspack/core@1.2.2(@swc/helpers@0.5.15)': + dependencies: + '@module-federation/runtime-tools': 0.8.4 + '@rspack/binding': 1.2.2 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001697 + optionalDependencies: + '@swc/helpers': 0.5.15 + + '@rspack/lite-tapable@1.0.1': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browser-process-hrtime@1.0.0: {} + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ini@1.3.8: {} + + is-buffer@1.1.6: {} + + is-extendable@0.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isomorphic-rslog@0.0.6: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + neuroglancer@file:../../..: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + pn@1.1.0: {} + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map@0.6.1: + optional: true + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + symbol-tree@3.2.4: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts b/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts new file mode 100644 index 0000000000..57492523e5 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/rsbuild.config.ts @@ -0,0 +1,60 @@ +import { defineConfig } from "@rsbuild/core"; + +export default defineConfig({ + html: { + title: "rsbuild neuroglancer test", + scriptLoading: "module", + mountId: "neuroglancer-container", + }, + output: { + // By default, running the dev-server also clears the dist directory. + cleanDistPath: process.env.NODE_ENV === "production", + assetPrefix: "./", + distPath: { + js: "", + jsAsync: "", + wasm: "", + css: "", + }, + }, + tools: { + rspack: { + module: { + rules: [ + // Needed to support Neuroglancer TypeScript sources when using + // Neuroglancer source package directly. + { + test: /\.tsx?$/, + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + }, + type: "javascript/auto", + }, + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + }, + }, + plugins: [], +}); diff --git a/examples/rsbuild/rsbuild-project-source/src/index.js b/examples/rsbuild/rsbuild-project-source/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rsbuild/rsbuild-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rspack/rspack-project-built/.gitignore b/examples/rspack/rspack-project-built/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rspack/rspack-project-built/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rspack/rspack-project-built/README.md b/examples/rspack/rspack-project-built/README.md new file mode 100644 index 0000000000..4d92187a2f --- /dev/null +++ b/examples/rspack/rspack-project-built/README.md @@ -0,0 +1 @@ +This demonstrates a dependent project that uses webpack for bundling. diff --git a/examples/rspack/rspack-project-built/package-lock.json b/examples/rspack/rspack-project-built/package-lock.json new file mode 100644 index 0000000000..019337ff54 --- /dev/null +++ b/examples/rspack/rspack-project-built/package-lock.json @@ -0,0 +1,4347 @@ +{ + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5" + } + }, + "../../../dist/package": { + "name": "neuroglancer", + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "@playwright/test": "^1.50.1", + "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", + "gl-matrix": "3.1.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.0.4.tgz", + "integrity": "sha512-aOcSN4MeAtFROysrbqG137b7gaDDSmVrl5mpo6sT/w+kcXpWnzhMjmY/Fh/sDx26NBxyIE7MB1seqLeCAzy9Sg==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rspack/binding": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.6.tgz", + "integrity": "sha512-vfeBEgGOYVwqj5cQjGyvdfrr/BEihAHlyIsobL98FZjTF0uig+bj2yJUH5Ib5F0BpIUKVG3Pw0IjlUBqcVpZsQ==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.6", + "@rspack/binding-darwin-x64": "1.1.6", + "@rspack/binding-linux-arm64-gnu": "1.1.6", + "@rspack/binding-linux-arm64-musl": "1.1.6", + "@rspack/binding-linux-x64-gnu": "1.1.6", + "@rspack/binding-linux-x64-musl": "1.1.6", + "@rspack/binding-win32-arm64-msvc": "1.1.6", + "@rspack/binding-win32-ia32-msvc": "1.1.6", + "@rspack/binding-win32-x64-msvc": "1.1.6" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.6.tgz", + "integrity": "sha512-x9dxm2yyiMuL1FBwvWNNMs2/mEUJmRoSRgYb8pblR7HDaTRORrjBFCqhaYlGyAqtQaeUy7o2VAQlE0BavIiFYA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.6.tgz", + "integrity": "sha512-o0seilveftGiDjy3VPxug20HmAgYyQbNEuagR3i93/t/PT/eWXHnik+C1jjwqcivZL1Zllqvy4tbZw393aROEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.6.tgz", + "integrity": "sha512-4atnoknJx/c3KaQElsMIxHMpPf2jcRRdWsH/SdqJIRSrkWWakMK9Yv4TFwH680I4HDTMf1XLboMVScHzW8e+Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.6.tgz", + "integrity": "sha512-7QMtwUtgFpt3/Y3/X18fSyN+kk4H8ZnZ8tDzQskVWc/j2AQYShZq56XQYqrhClzwujcCVAHauIQ2eiuJ2ASGag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.6.tgz", + "integrity": "sha512-MTjDEfPn4TwHoqs5d5Fck06kmXiTHZctGIcRVfrpg0RK0r1NLEHN+oosavRZ9c9H70f34+NmcHk+/qvV4c8lWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.6.tgz", + "integrity": "sha512-LqDw7PTVr/4ZuGA0izgDQfamfr72USFHltR1Qhy2YVC3JmDmhG/pQi13LHcOLVaGH1xoeyCmEPNJpVizzDxSjg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.6.tgz", + "integrity": "sha512-RHApLM93YN0WdHpS35u2cm7VCqZ8Yg3CrNRL16VJtyT9e6MBqeScoe4XIgIWKPm7edFyedYAjLX0wQOApwfjkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.6.tgz", + "integrity": "sha512-Y6lx4q0eJawRfMPBo/AclTJAPTZ325DSPFBQJB3TnWh9Z2X7P7pQcYc8PHDmfDuYRIdg5WRsQRvVxihSvF7v8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.6.tgz", + "integrity": "sha512-UuCsfhC/yNuU7xLASOxNXcmsXi2ZvBX14GkxvcdChw6q7IIGNYUKXo1zgR8C1PE/6qDSxmLxbRMS+71d0H3HQg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/cli": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.6.tgz", + "integrity": "sha512-404JTAadncCp81sDa7nGZdsT7r1Ry8fALR8Wkp9VMTUhWEFlbDGQvOTyali24pfyJxJTdsarSabmNhbDO5okJw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" + }, + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" + } + }, + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/@rspack/core": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.6.tgz", + "integrity": "sha512-q0VLphOF5VW2FEG7Vbdq3Ke4I74FbELE/8xmKghSalFtULLZ44SoSz8lyotfMim9GXIRFhDokAaH8WICmPxG+g==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.6", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@rspack/dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.10", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", + "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", + "dev": true, + "engines": { + "node": ">=10.18" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", + "dev": true, + "dependencies": { + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.1.2", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/neuroglancer": { + "resolved": "../../../dist/package", + "link": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/examples/rspack/rspack-project-built/package.json b/examples/rspack/rspack-project-built/package.json new file mode 100644 index 0000000000..37c4e18ffb --- /dev/null +++ b/examples/rspack/rspack-project-built/package.json @@ -0,0 +1,24 @@ +{ + "name": "neuroglancer-rspack-project-built", + "version": "0.0.0", + "private": true, + "description": "Test of an rspack-bundled project that depends on Neuroglancer.", + "scripts": { + "build": "rspack build", + "dev-server": "rspack serve" + }, + "dependencies": { + "neuroglancer": "file:../../../dist/package" + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5" + }, + "type": "module" +} diff --git a/examples/rspack/rspack-project-built/pnpm-lock.yaml b/examples/rspack/rspack-project-built/pnpm-lock.yaml new file mode 100644 index 0000000000..3d9acba69c --- /dev/null +++ b/examples/rspack/rspack-project-built/pnpm-lock.yaml @@ -0,0 +1,3353 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../../dist/package + version: file:../../../dist/package + devDependencies: + '@rspack/cli': + specifier: ^1.1.5 + version: 1.2.2(@rspack/core@1.2.2)(@types/express@4.17.21) + '@rspack/core': + specifier: ^1.1.5 + version: 1.2.2 + +packages: + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@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==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rspack/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.2.2': + resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.2.2': + resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + + '@rspack/cli@1.2.2': + resolution: {integrity: sha512-d1wsIqmQHjqfo2KKx9TOOW7M4PnD2Viv9FbosXRW/lisvPFJUTwg87onv2x3z4KTCHqplH9T4MCeKmCj+ZNKOw==} + hasBin: true + peerDependencies: + '@rspack/core': ^1.0.0-alpha || ^1.x + '@rspack/tracing': ^1.x + peerDependenciesMeta: + '@rspack/tracing': + optional: true + + '@rspack/core@1.2.2': + resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} + 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/dev-server@1.0.10': + resolution: {integrity: sha512-iDsEtP0jNHRm4LJxL00QFTlOuqkdxIFxnd69h0KrFadmtxAWiDLIe4vYdZXWF74w4MezsJFx6dB2nUM/Ok8utA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': '*' + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.5.14': + resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.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'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + 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-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.9: + resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + + http-proxy-middleware@2.0.7: + resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + 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'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neuroglancer@file:../../../dist/package: + resolution: {directory: ../../../dist/package, type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + 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'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + 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-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-bundle-analyzer@4.6.1: + resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.0.4: + resolution: {integrity: sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + +snapshots: + + '@discoveryjs/json-ext@0.5.7': {} + + '@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 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@rspack/binding-darwin-arm64@1.2.2': + optional: true + + '@rspack/binding-darwin-x64@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-musl@1.2.2': + optional: true + + '@rspack/binding-linux-x64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-x64-musl@1.2.2': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-x64-msvc@1.2.2': + optional: true + + '@rspack/binding@1.2.2': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.2.2 + '@rspack/binding-darwin-x64': 1.2.2 + '@rspack/binding-linux-arm64-gnu': 1.2.2 + '@rspack/binding-linux-arm64-musl': 1.2.2 + '@rspack/binding-linux-x64-gnu': 1.2.2 + '@rspack/binding-linux-x64-musl': 1.2.2 + '@rspack/binding-win32-arm64-msvc': 1.2.2 + '@rspack/binding-win32-ia32-msvc': 1.2.2 + '@rspack/binding-win32-x64-msvc': 1.2.2 + + '@rspack/cli@1.2.2(@rspack/core@1.2.2)(@types/express@4.17.21)': + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@rspack/core': 1.2.2 + '@rspack/dev-server': 1.0.10(@rspack/core@1.2.2)(@types/express@4.17.21) + colorette: 2.0.19 + exit-hook: 4.0.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack-bundle-analyzer: 4.6.1 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + + '@rspack/core@1.2.2': + dependencies: + '@module-federation/runtime-tools': 0.8.4 + '@rspack/binding': 1.2.2 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001697 + + '@rspack/dev-server@1.0.10(@rspack/core@1.2.2)(@types/express@4.17.21)': + dependencies: + '@rspack/core': 1.2.2 + chokidar: 3.6.0 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + mime-types: 2.1.35 + p-retry: 4.6.2 + webpack-dev-middleware: 7.4.2 + webpack-dev-server: 5.0.4 + ws: 8.18.0 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + + '@rspack/lite-tapable@1.0.1': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.13.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.13.1 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.6 + '@types/node': 22.13.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.13.1 + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.15': + dependencies: + '@types/node': 22.13.1 + + '@types/json-schema@7.0.15': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.13.1 + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.0': {} + + '@types/retry@0.12.2': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.13.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.13.1 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.13.1 + + '@types/ws@8.5.14': + dependencies: + '@types/node': 22.13.1 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-html-community@0.0.8: {} + + 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: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-equal@1.0.2: {} + + array-flatten@1.1.1: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.19: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@7.2.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-hook@4.0.0: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handle-thing@2.0.1: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + html-entities@2.5.2: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.9: {} + + http-proxy-middleware@2.0.7(@types/express@4.17.21): + dependencies: + '@types/http-proxy': 1.17.15 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.21 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + human-signals@2.1.0: {} + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@1.1.6: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-network-error@1.1.0: {} + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isomorphic-rslog@0.0.6: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + launch-editor@2.9.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memfs@4.17.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mrmime@1.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neuroglancer@file:../../../dist/package: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + node-forge@1.3.1: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-inspect@1.13.3: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + opener@1.5.2: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + parseurl@1.3.3: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pn@1.1.0: {} + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + process-nextick-args@2.0.1: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + run-applescript@7.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv@1.0.19: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 1.0.1 + totalist: 1.1.0 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-map@0.6.1: + optional: true + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.0 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.0 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + stealthy-require@1.1.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 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thunky@1.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@1.1.0: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webidl-conversions@4.0.2: {} + + webpack-bundle-analyzer@4.6.1: + dependencies: + acorn: 8.14.0 + acorn-walk: 8.3.4 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@7.4.2: + dependencies: + colorette: 2.0.19 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.0 + + webpack-dev-server@5.0.4: + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.14 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.19 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.21.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.1 + rimraf: 5.0.10 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.9 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + ws@7.5.10: {} + + ws@8.18.0: {} + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.6.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/examples/rspack/rspack-project-built/rspack.config.js b/examples/rspack/rspack-project-built/rspack.config.js new file mode 100644 index 0000000000..2dac5e39cf --- /dev/null +++ b/examples/rspack/rspack-project-built/rspack.config.js @@ -0,0 +1,46 @@ +import rspack from "@rspack/core"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new rspack.HtmlRspackPlugin({ + title: "Neuroglancer webpack test", + }), + ], + experiments: { + css: true, + }, +}; diff --git a/examples/rspack/rspack-project-built/src/index.js b/examples/rspack/rspack-project-built/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rspack/rspack-project-built/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/rspack/rspack-project-source/.gitignore b/examples/rspack/rspack-project-source/.gitignore new file mode 100644 index 0000000000..b0a5c349ca --- /dev/null +++ b/examples/rspack/rspack-project-source/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/examples/rspack/rspack-project-source/package-lock.json b/examples/rspack/rspack-project-source/package-lock.json new file mode 100644 index 0000000000..a8ec943f73 --- /dev/null +++ b/examples/rspack/rspack-project-source/package-lock.json @@ -0,0 +1,14169 @@ +{ + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "license": "Apache-2.0", + "dependencies": { + "neuroglancer": "file:../../.." + }, + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5" + } + }, + "../../..": { + "version": "2.40.1", + "license": "Apache-2.0", + "dependencies": { + "@playwright/test": "^1.50.1", + "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", + "gl-matrix": "3.1.0", + "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "lodash-es": "^4.17.21", + "nifti-reader-js": "^0.6.8", + "numcodecs": "^0.3.2" + }, + "devDependencies": { + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", + "@types/codemirror": "5.60.15", + "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", + "@types/lodash-es": "^4.17.12", + "@types/node": "^22.10.7", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", + "css-loader": "^7.1.2", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", + "playwright": "^1.49.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" + }, + "engines": { + "node": ">=22" + } + }, + "../../../node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/linux-x64": { + "version": "0.20.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "../../../node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "../../../node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@eslint/js": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "../../../node_modules/@humanwhocodes/object-schema": { + "version": "2.0.2", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "../../../node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "../../../node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/@one-ini/wasm": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/@polka/url": { + "version": "1.0.0-next.24", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@puppeteer/browsers": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "../../../node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", + "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-android-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", + "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", + "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-darwin-x64": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", + "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", + "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", + "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", + "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", + "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", + "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", + "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", + "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", + "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", + "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "../../../node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", + "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", + "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", + "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "../../../node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@sindresorhus/is": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "../../../node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/codemirror": { + "version": "5.60.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/tern": "*" + } + }, + "../../../node_modules/@types/eslint": { + "version": "8.56.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "../../../node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "../../../node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/gl-matrix": { + "version": "2.4.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash": { + "version": "4.14.202", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/lodash-es": { + "version": "4.17.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "../../../node_modules/@types/node": { + "version": "20.11.20", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "../../../node_modules/@types/tern": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "../../../node_modules/@types/which": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@types/yargs": { + "version": "17.0.32", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "../../../node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "../../../node_modules/@vitest/expect": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/@vitest/snapshot": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/spy": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/ui": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.3.1", + "fast-glob": "^3.3.2", + "fflate": "^0.8.1", + "flatted": "^3.2.9", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.3.1" + } + }, + "../../../node_modules/@vitest/utils": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "../../../node_modules/@wdio/config": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger": { + "version": "8.28.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/@wdio/protocols": { + "version": "8.32.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@wdio/repl": { + "version": "8.24.12", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/types": { + "version": "8.32.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@wdio/utils": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.28.0", + "@wdio/types": "8.32.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "../../../node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "../../../node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "../../../node_modules/abbrev": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "../../../node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/acorn-import-assertions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "../../../node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "../../../node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "../../../node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "../../../node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/archiver": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/archiver-utils/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/archiver-utils/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/archiver/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "../../../node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "../../../node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array-equal": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/array-includes": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/asn1": { + "version": "0.2.6", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "../../../node_modules/assert-plus": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/async": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/async-limiter": { + "version": "1.0.1", + "license": "MIT" + }, + "../../../node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "../../../node_modules/available-typed-arrays": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/aws-sign2": { + "version": "0.7.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/aws4": { + "version": "1.12.0", + "license": "MIT" + }, + "../../../node_modules/b4a": { + "version": "1.6.4", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/bare-events": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/bare-fs": { + "version": "2.1.5", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-os": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "../../../node_modules/bare-os": { + "version": "2.2.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "../../../node_modules/bare-path": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "../../../node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/basic-ftp": { + "version": "5.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "../../../node_modules/big-integer": { + "version": "1.6.52", + "dev": true, + "license": "Unlicense", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/binary": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "../../../node_modules/bluebird": { + "version": "3.4.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "../../../node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" + }, + "../../../node_modules/browserslist": { + "version": "4.23.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/buffers": { + "version": "0.1.1", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.2.0" + } + }, + "../../../node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cacheable-lookup": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request": { + "version": "10.2.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "../../../node_modules/cacheable-request/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/call-bind": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/caniuse-lite": { + "version": "1.0.30001596", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "optional": true, + "peer": true + }, + "../../../node_modules/caseless": { + "version": "0.12.0", + "license": "Apache-2.0" + }, + "../../../node_modules/chai": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/chainsaw": { + "version": "0.1.0", + "dev": true, + "license": "MIT/X11", + "optional": true, + "peer": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + } + }, + "../../../node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "../../../node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "../../../node_modules/chromium-bidi": { + "version": "0.4.16", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "../../../node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/codemirror": { + "version": "5.65.16", + "license": "MIT" + }, + "../../../node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "../../../node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "../../../node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "../../../node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "../../../node_modules/compress-commons": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/compress-commons/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/condense-newlines": { + "version": "0.2.1", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "../../../node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "../../../node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/crc-32": { + "version": "1.2.2", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/crc32-stream": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/crc32-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/cross-fetch": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "../../../node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "../../../node_modules/cross-fetch/node_modules/tr46": { + "version": "0.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/cross-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "../../../node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/css-loader": { + "version": "6.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "../../../node_modules/css-shorthand-properties": { + "version": "1.1.1", + "dev": true, + "optional": true, + "peer": true + }, + "../../../node_modules/css-value": { + "version": "0.0.1", + "dev": true, + "optional": true, + "peer": true + }, + "../../../node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/dashdash": { + "version": "1.14.1", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "../../../node_modules/decamelize": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/decompress-response": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/define-data-property": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/devtools-protocol": { + "version": "0.0.1262051", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "../../../node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/duplexer2": { + "version": "0.1.4", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "../../../node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "../../../node_modules/ecc-jsbn": { + "version": "0.1.2", + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "../../../node_modules/edge-paths": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "../../../node_modules/edgedriver": { + "version": "5.3.10", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "../../../node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/editorconfig": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/electron-to-chromium": { + "version": "1.4.699", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "../../../node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "../../../node_modules/enhanced-resolve": { + "version": "5.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/es-abstract": { + "version": "1.22.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/es-set-tostringtag": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "../../../node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/esbuild": { + "version": "0.20.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.1", + "@esbuild/android-arm": "0.20.1", + "@esbuild/android-arm64": "0.20.1", + "@esbuild/android-x64": "0.20.1", + "@esbuild/darwin-arm64": "0.20.1", + "@esbuild/darwin-x64": "0.20.1", + "@esbuild/freebsd-arm64": "0.20.1", + "@esbuild/freebsd-x64": "0.20.1", + "@esbuild/linux-arm": "0.20.1", + "@esbuild/linux-arm64": "0.20.1", + "@esbuild/linux-ia32": "0.20.1", + "@esbuild/linux-loong64": "0.20.1", + "@esbuild/linux-mips64el": "0.20.1", + "@esbuild/linux-ppc64": "0.20.1", + "@esbuild/linux-riscv64": "0.20.1", + "@esbuild/linux-s390x": "0.20.1", + "@esbuild/linux-x64": "0.20.1", + "@esbuild/netbsd-x64": "0.20.1", + "@esbuild/openbsd-x64": "0.20.1", + "@esbuild/sunos-x64": "0.20.1", + "@esbuild/win32-arm64": "0.20.1", + "@esbuild/win32-ia32": "0.20.1", + "@esbuild/win32-x64": "0.20.1" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", + "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", + "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", + "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/android-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", + "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", + "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", + "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", + "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", + "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", + "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", + "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", + "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-loong64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", + "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", + "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", + "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", + "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/linux-s390x": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", + "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", + "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", + "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/sunos-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", + "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-arm64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", + "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-ia32": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", + "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", + "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/eslint": { + "version": "8.56.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "../../../node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "dev": true, + "license": "ISC", + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "../../../node_modules/eslint-module-utils": { + "version": "2.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "../../../node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import": { + "version": "2.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "../../../node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "../../../node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "../../../node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "../../../node_modules/execa/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/npm-run-path": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../../../node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "../../../node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "../../../node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "../../../node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "../../../node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/fast-levenshtein": { + "version": "2.0.6", + "license": "MIT" + }, + "../../../node_modules/fastq": { + "version": "1.17.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "../../../node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "../../../node_modules/fetch-blob": { + "version": "3.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "../../../node_modules/fflate": { + "version": "0.8.1", + "license": "MIT" + }, + "../../../node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "../../../node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "../../../node_modules/flatted": { + "version": "3.2.9", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "../../../node_modules/foreground-child": { + "version": "3.1.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/form-data": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.17" + } + }, + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "../../../node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "../../../node_modules/fstream": { + "version": "1.0.12", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/fstream/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/fstream/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/fstream/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "../../../node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/geckodriver": { + "version": "4.3.3", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.5", + "unzipper": "^0.10.14", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "../../../node_modules/geckodriver/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + } + }, + "../../../node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "../../../node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/get-intrinsic": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-port": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/get-symbol-description": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/get-tsconfig": { + "version": "4.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "../../../node_modules/get-uri": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "../../../node_modules/gl-matrix": { + "version": "3.1.0", + "license": "MIT" + }, + "../../../node_modules/glob": { + "version": "10.3.10", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/got": { + "version": "12.6.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "../../../node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/has-property-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/has-tostringtag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/http-cache-semantics": { + "version": "4.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "../../../node_modules/http2-wrapper": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "../../../node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "../../../node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/ignore": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "../../../node_modules/ikonate": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" + } + }, + "../../../node_modules/ikonate/node_modules/abab": { + "version": "1.0.4", + "license": "ISC" + }, + "../../../node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/acorn-walk": { + "version": "6.2.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/ikonate/node_modules/cssom": { + "version": "0.3.8", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "license": "MIT", + "dependencies": { + "cssom": "0.3.x" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "license": "BSD-3-Clause" + }, + "../../../node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/domexception": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "../../../node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "../../../node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "license": "MIT", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "../../../node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "../../../node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "license": "BSD-2-Clause" + }, + "../../../node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "../../../node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/import-meta-resolve": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "../../../node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "../../../node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "../../../node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/internal-slot": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "../../../node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "../../../node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "../../../node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/is-plain-obj": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typed-array": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "../../../node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/is-whitespace": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "../../../node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "../../../node_modules/jackspeak": { + "version": "2.3.6", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "../../../node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "../../../node_modules/js-beautify": { + "version": "1.14.11", + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "../../../node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "../../../node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "../../../node_modules/jsdom": { + "version": "17.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.4.1", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.0", + "decimal.js": "^10.3.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^9.0.0", + "ws": "^8.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "../../../node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "../../../node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "../../../node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "../../../node_modules/jsonc-parser": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "../../../node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "../../../node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "../../../node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "../../../node_modules/kind-of": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/ky": { + "version": "0.33.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, + "../../../node_modules/lazystream": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "../../../node_modules/left-pad": { + "version": "1.3.0", + "license": "WTFPL" + }, + "../../../node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/lightningcss": { + "version": "1.23.0", + "dev": true, + "license": "MPL-2.0", + "optional": true, + "peer": true, + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.23.0", + "lightningcss-darwin-x64": "1.23.0", + "lightningcss-freebsd-x64": "1.23.0", + "lightningcss-linux-arm-gnueabihf": "1.23.0", + "lightningcss-linux-arm64-gnu": "1.23.0", + "lightningcss-linux-arm64-musl": "1.23.0", + "lightningcss-linux-x64-gnu": "1.23.0", + "lightningcss-linux-x64-musl": "1.23.0", + "lightningcss-win32-x64-msvc": "1.23.0" + } + }, + "../../../node_modules/lightningcss-linux-x64-gnu": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/lightningcss-linux-x64-musl": { + "version": "1.23.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "../../../node_modules/listenercount": { + "version": "1.0.1", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "../../../node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/locate-app": { + "version": "2.2.20", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, + "dependencies": { + "n12": "1.8.23", + "type-fest": "2.13.0", + "userhome": "1.0.0" + } + }, + "../../../node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "../../../node_modules/lodash.clonedeep": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" + }, + "../../../node_modules/lodash.zip": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/loglevel": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "../../../node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "../../../node_modules/lowercase-keys": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/lru-cache": { + "version": "10.2.0", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "../../../node_modules/magic-string": { + "version": "0.30.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "../../../node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "../../../node_modules/mimic-response": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/minimatch": { + "version": "9.0.3", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/minipass": { + "version": "7.0.4", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "../../../node_modules/mitt": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/mkdirp": { + "version": "0.5.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "../../../node_modules/mlly": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "../../../node_modules/mrmime": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/n12": { + "version": "1.8.23", + "dev": true, + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true + }, + "../../../node_modules/nanoid": { + "version": "3.3.7", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "../../../node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "../../../node_modules/nifti-reader-js": { + "version": "0.6.8", + "license": "MIT", + "dependencies": { + "fflate": "*" + } + }, + "../../../node_modules/node-domexception": { + "version": "1.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.5.0" + } + }, + "../../../node_modules/node-fetch": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "../../../node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/nopt": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "../../../node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/normalize-url": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/numcodecs": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "fflate": "^0.8.0" + } + }, + "../../../node_modules/nwmatcher": { + "version": "1.4.4", + "license": "MIT" + }, + "../../../node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "../../../node_modules/object-inspect": { + "version": "1.13.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.fromentries": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/object.groupby": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "../../../node_modules/object.values": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "../../../node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "../../../node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/p-cancelable": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + } + }, + "../../../node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/pac-proxy-agent": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/path-scurry": { + "version": "1.10.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "../../../node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "../../../node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true + }, + "../../../node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "../../../node_modules/pkg-types": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "../../../node_modules/pn": { + "version": "1.1.0", + "license": "MIT" + }, + "../../../node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "../../../node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-local-by-default": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-scope": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "../../../node_modules/postcss-selector-parser": { + "version": "6.0.15", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/prettier": { + "version": "3.2.5", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "../../../node_modules/pretty": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "../../../node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "../../../node_modules/proxy-agent": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/psl": { + "version": "1.9.0", + "license": "MIT" + }, + "../../../node_modules/pump": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "../../../node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/puppeteer-core": { + "version": "20.9.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "../../../node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/queue-tick": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/quick-lru": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "../../../node_modules/react-is": { + "version": "18.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "../../../node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/readdir-glob": { + "version": "1.1.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "../../../node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "../../../node_modules/request-promise-core": { + "version": "1.1.4", + "license": "ISC", + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native": { + "version": "1.0.9", + "license": "ISC", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "../../../node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "../../../node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "../../../node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/resolve-alpn": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "../../../node_modules/responselike": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/resq": { + "version": "1.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "../../../node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "../../../node_modules/rgb2hex": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "../../../node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/rollup": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", + "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.19.0", + "@rollup/rollup-android-arm64": "4.19.0", + "@rollup/rollup-darwin-arm64": "4.19.0", + "@rollup/rollup-darwin-x64": "4.19.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", + "@rollup/rollup-linux-arm-musleabihf": "4.19.0", + "@rollup/rollup-linux-arm64-gnu": "4.19.0", + "@rollup/rollup-linux-arm64-musl": "4.19.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", + "@rollup/rollup-linux-riscv64-gnu": "4.19.0", + "@rollup/rollup-linux-s390x-gnu": "4.19.0", + "@rollup/rollup-linux-x64-gnu": "4.19.0", + "@rollup/rollup-linux-x64-musl": "4.19.0", + "@rollup/rollup-win32-arm64-msvc": "4.19.0", + "@rollup/rollup-win32-ia32-msvc": "4.19.0", + "@rollup/rollup-win32-x64-msvc": "4.19.0", + "fsevents": "~2.3.2" + } + }, + "../../../node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "../../../node_modules/safaridriver": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/safe-array-concat": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "../../../node_modules/safe-regex-test": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "../../../node_modules/sax": { + "version": "1.3.0", + "license": "ISC" + }, + "../../../node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "../../../node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/serialize-error": { + "version": "11.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "../../../node_modules/set-function-length": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/set-function-name": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/setimmediate": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/side-channel": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "../../../node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks": { + "version": "2.7.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "../../../node_modules/socks-proxy-agent": { + "version": "8.0.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "../../../node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "../../../node_modules/split2": { + "version": "4.2.0", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.x" + } + }, + "../../../node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true + }, + "../../../node_modules/sshpk": { + "version": "1.18.0", + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/stealthy-require": { + "version": "1.1.1", + "license": "ISC", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/streamx": { + "version": "2.15.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "../../../node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "../../../node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/string.prototype.trim": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimend": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/strip-literal": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../../node_modules/strip-literal/node_modules/js-tokens": { + "version": "8.0.3", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../../../node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tar-fs": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "../../../node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "../../../node_modules/terser": { + "version": "5.29.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "../../../node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "../../../node_modules/tinybench": { + "version": "2.6.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/tinypool": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "../../../node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "../../../node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tough-cookie": { + "version": "4.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "../../../node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/traverse": { + "version": "0.3.9", + "dev": true, + "license": "MIT/X11", + "optional": true, + "peer": true + }, + "../../../node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "../../../node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "../../../node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD", + "optional": true, + "peer": true + }, + "../../../node_modules/tsx": { + "version": "4.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/tsx/node_modules/esbuild": { + "version": "0.19.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "../../../node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "../../../node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "../../../node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "../../../node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/typed-array-buffer": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "../../../node_modules/typed-array-byte-length": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typed-array-length": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/typescript": { + "version": "5.3.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "../../../node_modules/ufo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "../../../node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "../../../node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "../../../node_modules/unzipper": { + "version": "0.10.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "../../../node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "../../../node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "../../../node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "../../../node_modules/userhome": { + "version": "1.0.0", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "../../../node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "../../../node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "../../../node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "license": "MIT" + }, + "../../../node_modules/vite": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", + "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.39", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "../../../node_modules/vite-node": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "../../../node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "../../../node_modules/vitest": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.3.1", + "@vitest/runner": "1.3.1", + "@vitest/snapshot": "1.3.1", + "@vitest/spy": "1.3.1", + "@vitest/utils": "1.3.1", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.2", + "vite": "^5.0.0", + "vite-node": "1.3.1", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.3.1", + "@vitest/ui": "1.3.1", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "../../../node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/w3c-hr-time": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "../../../node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/wait-port": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/watchpack": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/web-streams-polyfill": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/webdriver": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "../../../node_modules/webdriverio": { + "version": "8.32.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.32.3", + "@wdio/logger": "8.28.0", + "@wdio/protocols": "8.32.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.32.2", + "@wdio/utils": "8.32.3", + "archiver": "^6.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1262051", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.32.3" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "../../../node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "../../../node_modules/webpack": { + "version": "5.90.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "../../../node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "../../../node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "../../../node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "../../../node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "../../../node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "../../../node_modules/whatwg-encoding": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "../../../node_modules/whatwg-mimetype": { + "version": "2.3.0", + "license": "MIT" + }, + "../../../node_modules/whatwg-url": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "../../../node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/which-typed-array": { + "version": "1.1.13", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "../../../node_modules/why-is-node-running": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/word-wrap": { + "version": "1.2.5", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "../../../node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "../../../node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "../../../node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "../../../node_modules/xml-name-validator": { + "version": "3.0.0", + "license": "Apache-2.0" + }, + "../../../node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/xmldom": { + "version": "0.1.31", + "license": "(LGPL-2.0 or MIT)", + "engines": { + "node": ">=0.1" + } + }, + "../../../node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "../../../node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "../../../node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "../../../node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "../../../node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "../../../node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "../../../node_modules/zip-stream": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "../../../node_modules/zip-stream/node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.5.1.tgz", + "integrity": "sha512-xgiMUWwGLWDrvZc9JibuEbXIbhXg6z2oUkemogSvQ4LKvrl/n0kbqP1Blk669mXzyWbqtSp6PpvNdwaE1aN5xQ==", + "dev": true, + "dependencies": { + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.5.1.tgz", + "integrity": "sha512-nfBedkoZ3/SWyO0hnmaxuz0R0iGPSikHZOAZ0N/dVSQaIzlffUo35B5nlC2wgWIc0JdMZfkwkjZRrnuuDIJbzg==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/webpack-bundler-runtime": "0.5.1" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.5.1.tgz", + "integrity": "sha512-exvchtjNURJJkpqjQ3/opdbfeT2wPKvrbnGnyRkrwW5o3FH1LaST1tkiNviT6OXTexGaVc2DahbdniQHVtQ7pA==", + "dev": true + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.5.1.tgz", + "integrity": "sha512-mMhRFH0k2VjwHt3Jol9JkUsmI/4XlrAoBG3E0o7HoyoPYv1UFOWyqAflfANcUPgbYpvqmyLzDcO+3IT36LXnrA==", + "dev": true, + "dependencies": { + "@module-federation/runtime": "0.5.1", + "@module-federation/sdk": "0.5.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rspack/binding": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.1.5.tgz", + "integrity": "sha512-RsSkgi56Q5XUXut0qweLSE1C4Ogcm7g/ueKoOgsbHAYVKrCs9/dTFlPHWSIAaI7QWh0GWEePR/MM2O2HIu+1rw==", + "dev": true, + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.1.5", + "@rspack/binding-darwin-x64": "1.1.5", + "@rspack/binding-linux-arm64-gnu": "1.1.5", + "@rspack/binding-linux-arm64-musl": "1.1.5", + "@rspack/binding-linux-x64-gnu": "1.1.5", + "@rspack/binding-linux-x64-musl": "1.1.5", + "@rspack/binding-win32-arm64-msvc": "1.1.5", + "@rspack/binding-win32-ia32-msvc": "1.1.5", + "@rspack/binding-win32-x64-msvc": "1.1.5" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz", + "integrity": "sha512-eEynmyPPl+OGYQ9LRFwiQosyRfcca3OQB73akqY4mqDRl39OyiBjq7347DLHJysgbm9z+B1bsiLuh2xc6mdclQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz", + "integrity": "sha512-I6HPRgogewU5v1OKe3noEzq2U1FCEYAbW+smy+lPvpTW+3X6PlVMzTT4oelhB0EXDQ+KxjXH9KpOKON1hg/JGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz", + "integrity": "sha512-LQnqucNa6Dr6y3By+/M2ARO4jDR3AM+PuCsHgzlYT0RDRLS+Ow3f50WbNBf7eI/DhrEA0aucYL3sz1ljguB3EA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz", + "integrity": "sha512-b9L/9HJxrWY4cezPWqgj28I9Xe2XxwLHu8x0CMGobwF2XKR0QQVLAst38RW/EusJ8TURdyvNEOuRZlWEIJuYOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz", + "integrity": "sha512-0az52ZXTg/ErCGC1v/oFLWByKAiXvng4euv+prwMWF6p1pA7lfLRLzdibDFO4KgC16Zlfcg3hqs7YikLng4x+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz", + "integrity": "sha512-EF/LJTtCTkuti2gJnCyvXHC5Q2L5M4+RXm5kj9Bfu/t0Zmmfe6Jd5QUsifgogioeL0ZsH/Pou5QiiVcOFcqFKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz", + "integrity": "sha512-VEqhK6HwIHby6gtOkxIx66SkqYndiaP1ddZ3X39RLE40TY3KlNgfG/SzbN9J5Qb+8jjq3ogV8n50+wLEGkhiWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.1.5.tgz", + "integrity": "sha512-Yi2BwYehc5/sRVgI7zTGYJKjnV8UszAJt/stWdFHaq82chHiuuF/tQd1WcBUq0Iin9ylBMo16mRJAuFkFmJ74Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz", + "integrity": "sha512-4UArXYqJO1Ni7TmCw1T11JnrwfpoThDdiQ9k1P1voBWK3bDahPEBOptk9ZPu2+ZuRX8hFrvumRKkLY3oy7fTMw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rspack/cli": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.1.5.tgz", + "integrity": "sha512-R08aM5gEvRV9zSE9fIaTxT77Nu/kRtoghj9TqItFk0xTbFxai9jF1fwRTbnDv23yVGNCwPfwvPOmpqvrf3SGnQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.9", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "semver": "^7.6.2", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" + }, + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" + } + }, + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "node_modules/@rspack/core": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.1.5.tgz", + "integrity": "sha512-/FmxDeMuW8fJkhz8fHuCu7OiJHFKW78xclEu7LkEujWl4PqJgdWjUL/6FWIj50spRwj6PRfuc31hFSL4hbNfCA==", + "dev": true, + "dependencies": { + "@module-federation/runtime-tools": "0.5.1", + "@rspack/binding": "1.1.5", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@rspack/dev-server": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.9.tgz", + "integrity": "sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, + "peerDependencies": { + "@rspack/core": "*" + } + }, + "node_modules/@rspack/dev-server/node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@rspack/dev-server/node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.42", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.11.10", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.9.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "optional": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001580", + "electron-to-chromium": "^1.4.648", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.649", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-network-error": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/launch-editor": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "4.7.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">= 4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/neuroglancer": { + "resolved": "../../..", + "link": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "10.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-retry": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.27.0", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", + "dev": true, + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^4.6.0", + "mime-types": "^2.1.31", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.4.0", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.16.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/examples/rspack/rspack-project-source/package.json b/examples/rspack/rspack-project-source/package.json new file mode 100644 index 0000000000..615515febd --- /dev/null +++ b/examples/rspack/rspack-project-source/package.json @@ -0,0 +1,24 @@ +{ + "name": "neuroglancer-rspack-project-source", + "version": "0.0.0", + "private": true, + "description": "Test of an rspack-bundled project that depends on Neuroglancer.", + "scripts": { + "build": "rspack build", + "dev-server": "rspack serve" + }, + "dependencies": { + "neuroglancer": "file:../../.." + }, + "browserslist": [ + "last 2 Chrome versions", + "last 2 Firefox versions", + "last 2 Safari versions" + ], + "license": "Apache-2.0", + "devDependencies": { + "@rspack/cli": "^1.1.5", + "@rspack/core": "^1.1.5" + }, + "type": "module" +} diff --git a/examples/rspack/rspack-project-source/pnpm-lock.yaml b/examples/rspack/rspack-project-source/pnpm-lock.yaml new file mode 100644 index 0000000000..f108f48cac --- /dev/null +++ b/examples/rspack/rspack-project-source/pnpm-lock.yaml @@ -0,0 +1,3353 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../.. + version: file:../../.. + devDependencies: + '@rspack/cli': + specifier: ^1.1.5 + version: 1.2.2(@rspack/core@1.2.2)(@types/express@4.17.21) + '@rspack/core': + specifier: ^1.1.5 + version: 1.2.2 + +packages: + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@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==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@polka/url@1.0.0-next.28': + resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + + '@rspack/binding-darwin-arm64@1.2.2': + resolution: {integrity: sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@1.2.2': + resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + cpu: [arm64] + os: [linux] + + '@rspack/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + cpu: [x64] + os: [linux] + + '@rspack/binding-win32-arm64-msvc@1.2.2': + resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@1.2.2': + resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} + cpu: [x64] + os: [win32] + + '@rspack/binding@1.2.2': + resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + + '@rspack/cli@1.2.2': + resolution: {integrity: sha512-d1wsIqmQHjqfo2KKx9TOOW7M4PnD2Viv9FbosXRW/lisvPFJUTwg87onv2x3z4KTCHqplH9T4MCeKmCj+ZNKOw==} + hasBin: true + peerDependencies: + '@rspack/core': ^1.0.0-alpha || ^1.x + '@rspack/tracing': ^1.x + peerDependenciesMeta: + '@rspack/tracing': + optional: true + + '@rspack/core@1.2.2': + resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} + 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/dev-server@1.0.10': + resolution: {integrity: sha512-iDsEtP0jNHRm4LJxL00QFTlOuqkdxIFxnd69h0KrFadmtxAWiDLIe4vYdZXWF74w4MezsJFx6dB2nUM/Ok8utA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': '*' + + '@rspack/lite-tapable@1.0.1': + resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} + engines: {node: '>=16.0.0'} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.0': + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.5.14': + resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.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'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + 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-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + default-gateway@6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + html-entities@2.5.2: + resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.9: + resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + + http-proxy-middleware@2.0.7: + resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + 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'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neuroglancer@file:../../..: + resolution: {directory: ../../.., type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + opener@1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + 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'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} + engines: {node: '>= 10'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + 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-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} + engines: {node: '>=6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-bundle-analyzer@4.6.1: + resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} + engines: {node: '>= 10.13.0'} + hasBin: true + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.0.4: + resolution: {integrity: sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} + engines: {node: '>=12'} + +snapshots: + + '@discoveryjs/json-ext@0.5.7': {} + + '@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 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@polka/url@1.0.0-next.28': {} + + '@rspack/binding-darwin-arm64@1.2.2': + optional: true + + '@rspack/binding-darwin-x64@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-arm64-musl@1.2.2': + optional: true + + '@rspack/binding-linux-x64-gnu@1.2.2': + optional: true + + '@rspack/binding-linux-x64-musl@1.2.2': + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-ia32-msvc@1.2.2': + optional: true + + '@rspack/binding-win32-x64-msvc@1.2.2': + optional: true + + '@rspack/binding@1.2.2': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.2.2 + '@rspack/binding-darwin-x64': 1.2.2 + '@rspack/binding-linux-arm64-gnu': 1.2.2 + '@rspack/binding-linux-arm64-musl': 1.2.2 + '@rspack/binding-linux-x64-gnu': 1.2.2 + '@rspack/binding-linux-x64-musl': 1.2.2 + '@rspack/binding-win32-arm64-msvc': 1.2.2 + '@rspack/binding-win32-ia32-msvc': 1.2.2 + '@rspack/binding-win32-x64-msvc': 1.2.2 + + '@rspack/cli@1.2.2(@rspack/core@1.2.2)(@types/express@4.17.21)': + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@rspack/core': 1.2.2 + '@rspack/dev-server': 1.0.10(@rspack/core@1.2.2)(@types/express@4.17.21) + colorette: 2.0.19 + exit-hook: 4.0.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack-bundle-analyzer: 4.6.1 + yargs: 17.6.2 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + + '@rspack/core@1.2.2': + dependencies: + '@module-federation/runtime-tools': 0.8.4 + '@rspack/binding': 1.2.2 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001697 + + '@rspack/dev-server@1.0.10(@rspack/core@1.2.2)(@types/express@4.17.21)': + dependencies: + '@rspack/core': 1.2.2 + chokidar: 3.6.0 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + mime-types: 2.1.35 + p-retry: 4.6.2 + webpack-dev-middleware: 7.4.2 + webpack-dev-server: 5.0.4 + ws: 8.18.0 + transitivePeerDependencies: + - '@types/express' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + - webpack-cli + + '@rspack/lite-tapable@1.0.1': {} + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.13.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.13.1 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.6 + '@types/node': 22.13.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.13.1 + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.15': + dependencies: + '@types/node': 22.13.1 + + '@types/json-schema@7.0.15': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.13.1 + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.0': {} + + '@types/retry@0.12.2': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.13.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.13.1 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.13.1 + + '@types/ws@8.5.14': + dependencies: + '@types/node': 22.13.1 + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-html-community@0.0.8: {} + + 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: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-equal@1.0.2: {} + + array-flatten@1.1.1: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.19: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@7.2.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + default-gateway@6.0.3: + dependencies: + execa: 5.1.1 + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + duplexer@0.1.2: {} + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + ee-first@1.1.1: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit-hook@4.0.0: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + + handle-thing@2.0.1: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + html-entities@2.5.2: {} + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.9: {} + + http-proxy-middleware@2.0.7(@types/express@4.17.21): + dependencies: + '@types/http-proxy': 1.17.15 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.21 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + human-signals@2.1.0: {} + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@1.1.6: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-network-error@1.1.0: {} + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-stream@2.0.1: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isomorphic-rslog@0.0.6: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + launch-editor@2.9.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memfs@4.17.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mimic-fn@2.1.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + mrmime@1.0.1: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neuroglancer@file:../../..: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + node-forge@1.3.1: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-inspect@1.13.3: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + opener@1.5.2: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + p-retry@4.6.2: + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + parseurl@1.3.3: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pn@1.1.0: {} + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + process-nextick-args@2.0.1: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + run-applescript@7.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sirv@1.0.19: + dependencies: + '@polka/url': 1.0.0-next.28 + mrmime: 1.0.1 + totalist: 1.1.0 + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-map@0.6.1: + optional: true + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.0 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.0 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + stealthy-require@1.1.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 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thunky@1.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + totalist@1.1.0: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utils-merge@1.0.1: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webidl-conversions@4.0.2: {} + + webpack-bundle-analyzer@4.6.1: + dependencies: + acorn: 8.14.0 + acorn-walk: 8.3.4 + chalk: 4.1.2 + commander: 7.2.0 + gzip-size: 6.0.0 + lodash: 4.17.21 + opener: 1.5.2 + sirv: 1.0.19 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + webpack-dev-middleware@7.4.2: + dependencies: + colorette: 2.0.19 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.0 + + webpack-dev-server@5.0.4: + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.14 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.19 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + default-gateway: 6.0.3 + express: 4.21.2 + graceful-fs: 4.2.11 + html-entities: 2.5.2 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.1 + rimraf: 5.0.10 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.9 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + ws@7.5.10: {} + + ws@8.18.0: {} + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} + + y18n@5.0.8: {} + + yargs-parser@21.1.1: {} + + yargs@17.6.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 diff --git a/examples/rspack/rspack-project-source/rspack.config.js b/examples/rspack/rspack-project-source/rspack.config.js new file mode 100644 index 0000000000..8eff44f67b --- /dev/null +++ b/examples/rspack/rspack-project-source/rspack.config.js @@ -0,0 +1,61 @@ +import rspack from "@rspack/core"; + +export default { + mode: "development", + performance: { + // Avoid unhelpful warnings due to large bundles. + maxAssetSize: 3 * 1024 * 1024, + maxEntrypointSize: 3 * 1024 * 1024, + }, + module: { + rules: [ + // Needed to support Neuroglancer TypeScript sources when using + // Neuroglancer source package directly. + { + test: /\.tsx?$/, + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + }, + type: "javascript/auto", + }, + // Needed for .svg?raw imports used for embedding icons. + { + resourceQuery: /raw/, + type: "asset/source", + }, + // Needed for .html assets used for auth redirect pages for the brainmaps + // and bossDB data sources. Can be skipped if those data sources are + // excluded. + { + test: /\.html$/, + type: "asset/resource", + generator: { + // Filename must be preserved since exact redirect URLs must be allowlisted. + filename: "[name][ext]", + }, + }, + ], + }, + devServer: { + client: { + overlay: { + // Prevent intrusive notification spam. + runtimeErrors: false, + }, + }, + }, + plugins: [ + new rspack.HtmlRspackPlugin({ + title: "Neuroglancer webpack test", + }), + ], + experiments: { + css: true, + }, +}; diff --git a/examples/rspack/rspack-project-source/src/index.js b/examples/rspack/rspack-project-source/src/index.js new file mode 100644 index 0000000000..805818b627 --- /dev/null +++ b/examples/rspack/rspack-project-source/src/index.js @@ -0,0 +1,3 @@ +import "neuroglancer"; +import { setupDefaultViewer } from "neuroglancer/unstable/ui/default_viewer_setup.js"; +setupDefaultViewer(); diff --git a/examples/vite/vite-project-built/package-lock.json b/examples/vite/vite-project-built/package-lock.json index 426618e87f..1d4bd1d040 100644 --- a/examples/vite/vite-project-built/package-lock.json +++ b/examples/vite/vite-project-built/package-lock.json @@ -20,16 +20,18 @@ "version": "2.40.1", "license": "Apache-2.0", "dependencies": { + "@playwright/test": "^1.50.1", "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/examples/vite/vite-project-built/pnpm-lock.yaml b/examples/vite/vite-project-built/pnpm-lock.yaml new file mode 100644 index 0000000000..90998affdd --- /dev/null +++ b/examples/vite/vite-project-built/pnpm-lock.yaml @@ -0,0 +1,1722 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../../dist/package + version: file:../../../dist/package + devDependencies: + vite: + specifier: ^5.3.4 + version: 5.4.14 + +packages: + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.34.2': + resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.2': + resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.2': + resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.2': + resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.2': + resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.2': + resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': + resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.2': + resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.2': + resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.2': + resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': + resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': + resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.2': + resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.2': + resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.2': + resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.2': + resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.2': + resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.2': + resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.2': + resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neuroglancer@file:../../../dist/package: + resolution: {directory: ../../../dist/package, type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + rollup@4.34.2: + resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + 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'} + + 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'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + 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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.2': + optional: true + + '@rollup/rollup-android-arm64@4.34.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.2': + optional: true + + '@rollup/rollup-darwin-x64@4.34.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.2': + optional: true + + '@types/estree@1.0.6': {} + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browser-process-hrtime@1.0.0: {} + + caseless@0.12.0: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ini@1.3.8: {} + + is-buffer@1.1.6: {} + + is-extendable@0.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + nanoid@3.3.8: {} + + neuroglancer@file:../../../dist/package: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + pn@1.1.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + rollup@4.34.2: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.2 + '@rollup/rollup-android-arm64': 4.34.2 + '@rollup/rollup-darwin-arm64': 4.34.2 + '@rollup/rollup-darwin-x64': 4.34.2 + '@rollup/rollup-freebsd-arm64': 4.34.2 + '@rollup/rollup-freebsd-x64': 4.34.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.2 + '@rollup/rollup-linux-arm-musleabihf': 4.34.2 + '@rollup/rollup-linux-arm64-gnu': 4.34.2 + '@rollup/rollup-linux-arm64-musl': 4.34.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2 + '@rollup/rollup-linux-riscv64-gnu': 4.34.2 + '@rollup/rollup-linux-s390x-gnu': 4.34.2 + '@rollup/rollup-linux-x64-gnu': 4.34.2 + '@rollup/rollup-linux-x64-musl': 4.34.2 + '@rollup/rollup-win32-arm64-msvc': 4.34.2 + '@rollup/rollup-win32-ia32-msvc': 4.34.2 + '@rollup/rollup-win32-x64-msvc': 4.34.2 + fsevents: 2.3.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: + optional: true + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + symbol-tree@3.2.4: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + vite@5.4.14: + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.34.2 + optionalDependencies: + fsevents: 2.3.3 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/vite/vite-project-built/vite.config.ts b/examples/vite/vite-project-built/vite.config.ts index b8be9b45a4..d8cacae15e 100644 --- a/examples/vite/vite-project-built/vite.config.ts +++ b/examples/vite/vite-project-built/vite.config.ts @@ -23,8 +23,25 @@ export default defineConfig({ fs: { // Allow serving files from parent neuroglancer project, due to the local // path reference. This would not be needed for projects that depend on - // Neuroglancer normally. + // Neuroglancer normally, or when using pnpm rather than npm. allow: ["../../.."], }, }, + optimizeDeps: { + entries: [ + "index.html", + // In order for Vite to properly find all of Neuroglancer's transitive + // dependencies, instruct Vite to search for dependencies starting from + // all of the bundle entry points. + // + // These have to be specified explicitly because vite does not allow globs + // within `node_modules`. + "node_modules/neuroglancer/lib/main.bundle.js", + "node_modules/neuroglancer/lib/async_computation.bundle.js", + "node_modules/neuroglancer/lib/chunk_worker.bundle.js", + ], + // Neuroglancer is incompatible with Vite's optimizeDeps step used for the + // dev server due to its use of `new URL` syntax (not supported by esbuild). + exclude: ["neuroglancer"], + }, }); diff --git a/examples/vite/vite-project-source/package-lock.json b/examples/vite/vite-project-source/package-lock.json index 92a35cca70..6926a2908b 100644 --- a/examples/vite/vite-project-source/package-lock.json +++ b/examples/vite/vite-project-source/package-lock.json @@ -19,52 +19,63 @@ "version": "2.40.1", "license": "Apache-2.0", "dependencies": { + "@playwright/test": "^1.50.1", "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.7", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", + "playwright": "^1.49.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -75,99 +86,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -362,26 +280,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -395,6 +299,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -403,6 +309,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -411,6 +319,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -425,16 +335,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -488,6 +395,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -537,6 +446,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -548,6 +459,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -559,8 +472,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -568,24 +479,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -595,27 +491,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -625,6 +506,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -635,81 +518,24 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -729,11 +555,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -742,74 +563,6 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "../../../node_modules/@types/tern": { "version": "0.23.9", "dev": true, @@ -821,12 +574,16 @@ "../../../node_modules/@types/which": { "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/ws": { "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -849,216 +606,35 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/@vitest/browser": { + "version": "1.3.1", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" + "@vitest/utils": "1.3.1", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" + "playwright": "*", + "vitest": "1.3.1", + "webdriverio": "*" }, "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/@vitest/browser": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.3.1", - "magic-string": "^0.30.5", - "sirv": "^2.0.4" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "1.3.1", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "playwright": { + "playwright": { "optional": true }, "safaridriver": { @@ -1190,6 +766,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1207,6 +785,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1221,6 +801,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1232,6 +814,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1243,6 +827,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1256,12 +842,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1273,6 +863,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1284,6 +876,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1307,6 +901,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1315,22 +911,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1340,12 +944,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1357,6 +965,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1365,6 +975,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1372,12 +984,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1393,6 +1009,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1405,6 +1023,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1416,6 +1036,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1429,68 +1051,31 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, "../../../node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "../../../node_modules/abab": { "version": "2.0.6", "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true + "license": "BSD-3-Clause" }, "../../../node_modules/abbrev": { "version": "2.0.0", @@ -1499,18 +1084,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -1526,8 +1099,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -1537,8 +1108,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1550,6 +1119,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -1566,8 +1137,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -1576,8 +1145,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -1599,120 +1166,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ajv-keywords": { - "version": "3.5.2", + "../../../node_modules/ajv-keywords": { + "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -1733,22 +1196,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -1766,6 +1219,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -1782,6 +1237,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1800,6 +1257,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1811,6 +1270,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1824,6 +1285,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -1842,6 +1305,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -1865,11 +1330,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -1888,14 +1348,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -1994,6 +1446,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -2001,18 +1455,12 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -2022,14 +1470,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2055,7 +1495,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -2065,13 +1507,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2083,13 +1527,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2111,21 +1557,20 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2137,318 +1582,117 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", + "../../../node_modules/bluebird": { + "version": "3.4.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "balanced-match": "^1.0.0" } }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", + "../../../node_modules/braces": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "../../../node_modules/bluebird": { - "version": "3.4.7", - "dev": true, - "license": "MIT" + "../../../node_modules/browser-process-hrtime": { + "version": "1.0.0", + "license": "BSD-2-Clause" }, - "../../../node_modules/body-parser": { - "version": "1.20.2", + "../../../node_modules/browserslist": { + "version": "4.23.0", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", + "../../../node_modules/buffer-crc32": { + "version": "0.2.13", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": "*" } }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", + "../../../node_modules/buffer-from": { + "version": "1.1.2", "dev": true, "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } + "optional": true, + "peer": true }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", + "../../../node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10" + } }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", + "../../../node_modules/buffers": { + "version": "0.1.1", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "../../../node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/browser-process-hrtime": { - "version": "1.0.0", - "license": "BSD-2-Clause" - }, - "../../../node_modules/browserslist": { - "version": "4.23.0", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "../../../node_modules/buffer-crc32": { - "version": "0.2.13", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "../../../node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "../../../node_modules/buffers": { - "version": "0.1.1", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">=0.2.0" } }, "../../../node_modules/cac": { @@ -2463,6 +1707,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -2471,6 +1717,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -2488,6 +1736,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -2516,26 +1766,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -2553,7 +1783,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -2580,6 +1812,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -2610,44 +1844,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -2656,6 +1858,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -2663,67 +1867,6 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/cliui": { "version": "8.0.1", "dev": true, @@ -2810,11 +1953,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -2825,28 +1963,22 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -2861,79 +1993,22 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -2958,73 +2033,15 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" - }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -3037,6 +2054,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -3049,6 +2068,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3062,6 +2083,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -3070,6 +2093,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3088,17 +2113,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -3150,39 +2181,17 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true - }, - "../../../node_modules/css-what": { - "version": "6.1.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -3198,16 +2207,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -3218,9 +2223,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -3236,6 +2239,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -3244,8 +2249,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -3259,8 +2262,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -3272,8 +2273,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3282,8 +2281,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3292,236 +2289,113 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/debounce": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "../../../node_modules/decamelize": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/decimal.js": { - "version": "10.4.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../../node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/deep-eql": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/deep-is": { - "version": "0.1.4", - "license": "MIT" - }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/deepmerge-ts": { - "version": "5.1.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=16.0.0" - } - }, - "../../../node_modules/default-browser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">= 10" + "node": ">=12" } }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", + "../../../node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "../../../node_modules/debug": { + "version": "4.3.4", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "ms": "2.1.2" }, "engines": { - "node": ">=10" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", + "../../../node_modules/decamelize": { + "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", + "../../../node_modules/decimal.js": { + "version": "10.4.3", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } + "license": "MIT" }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", + "../../../node_modules/decompress-response": { + "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", + "../../../node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/defaults": { - "version": "1.0.4", + "../../../node_modules/deep-eql": { + "version": "4.1.3", "dev": true, "license": "MIT", "dependencies": { - "clone": "^1.0.2" + "type-detect": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", + "../../../node_modules/deep-is": { + "version": "0.1.4", + "license": "MIT" + }, + "../../../node_modules/deepmerge-ts": { + "version": "5.1.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { - "node": ">=0.8" + "node": ">=16.0.0" } }, "../../../node_modules/defer-to-connect": { "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -3539,17 +2413,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/define-properties": { "version": "1.2.1", "dev": true, @@ -3570,6 +2433,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -3586,31 +2451,16 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -3624,15 +2474,12 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -3642,28 +2489,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -3675,44 +2500,10 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -3724,48 +2515,10 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -3773,7 +2526,10 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -3794,6 +2550,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -3810,6 +2568,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -3826,6 +2586,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -3834,6 +2596,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -3880,97 +2644,37 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" - }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" - }, - "../../../node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/end-of-stream": { - "version": "1.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "../../../node_modules/enhanced-resolve": { - "version": "5.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" }, - "../../../node_modules/envinfo": { - "version": "7.11.1", + "../../../node_modules/end-of-stream": { + "version": "1.4.4", "dev": true, "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" } }, - "../../../node_modules/error-ex": { - "version": "1.3.2", + "../../../node_modules/enhanced-resolve": { + "version": "5.15.0", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, "../../../node_modules/es-abstract": { @@ -4028,7 +2732,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4104,23 +2810,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/escalade": { "version": "3.1.1", "dev": true, @@ -4129,11 +2818,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -4147,6 +2831,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -4218,18 +2903,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -4272,71 +2945,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -4464,106 +3072,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -4635,6 +3143,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -4647,26 +3156,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -4739,75 +3228,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -4826,6 +3246,8 @@ "version": "2.0.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -4845,6 +3267,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -4862,27 +3286,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -4890,7 +3293,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -4926,31 +3331,12 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" + "dependencies": { + "reusify": "^1.0.4" } }, "../../../node_modules/fd-slicer": { @@ -4975,6 +3361,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -5009,51 +3397,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5095,26 +3438,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -5144,223 +3467,10 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "../../../node_modules/form-data": { "version": "4.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -5374,6 +3484,8 @@ "version": "2.1.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14.17" } @@ -5382,6 +3494,8 @@ "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fetch-blob": "^3.1.2" }, @@ -5389,26 +3503,12 @@ "node": ">=12.20.0" } }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/fs-extra": { "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -5422,15 +3522,12 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, "../../../node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -5440,6 +3537,8 @@ "version": "1.0.12", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -5454,6 +3553,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5463,6 +3564,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5482,6 +3585,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -5493,6 +3598,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -5502,6 +3609,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5537,6 +3645,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -5558,6 +3668,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -5569,6 +3681,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5581,6 +3695,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -5593,6 +3709,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -5601,6 +3719,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -5645,6 +3765,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -5693,6 +3815,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -5707,6 +3831,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -5756,21 +3882,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -5811,42 +3925,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -5862,6 +3940,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -5886,6 +3966,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -5901,7 +3983,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -5922,11 +4006,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -5945,13 +4024,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -6017,6 +4089,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6025,31 +4098,10 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -6057,152 +4109,22 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -6212,40 +4134,6 @@ "node": ">= 6" } }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/http-signature": { "version": "1.2.0", "license": "MIT", @@ -6263,6 +4151,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -6275,8 +4165,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -6331,7 +4219,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -6571,115 +4461,40 @@ "version": "6.5.0", "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "../../../node_modules/ikonate/node_modules/ws": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" - } - }, - "../../../node_modules/import-fresh": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "../../../node_modules/import-local/node_modules/p-locate": { + "../../../node_modules/ikonate/node_modules/ws": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", + "../../../node_modules/import-fresh": { + "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "../../../node_modules/import-meta-resolve": { "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -6704,19 +4519,8 @@ }, "../../../node_modules/inherits": { "version": "2.0.4", - "license": "ISC" - }, - "../../../node_modules/ini": { - "version": "2.0.0", "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" + "license": "ISC" }, "../../../node_modules/internal-slot": { "version": "1.0.6", @@ -6731,18 +4535,12 @@ "node": ">= 0.4" } }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, "../../../node_modules/ip-address": { "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -6754,15 +4552,9 @@ "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" - } + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -6777,11 +4569,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -6793,17 +4580,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -6836,6 +4612,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -6858,20 +4635,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -6905,49 +4668,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -6959,17 +4679,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -7004,6 +4713,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -7025,9 +4736,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -7112,17 +4821,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -7141,22 +4839,9 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -7191,26 +4876,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -7224,6 +4895,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -7252,11 +4925,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -7276,8 +4944,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -7327,7 +4993,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -7346,17 +5014,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -7366,6 +5023,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -7377,6 +5036,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -7416,6 +5077,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -7423,19 +5086,12 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -7527,37 +5183,23 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/loader-runner": { "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -7577,6 +5219,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -7587,6 +5231,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -7619,57 +5265,32 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", "dev": true, "license": "MIT" }, - "../../../node_modules/lodash.sortby": { - "version": "4.7.0", - "license": "MIT" - }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/lodash.zip": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "../../../node_modules/lodash.sortby": { + "version": "4.7.0", + "license": "MIT" }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", + "../../../node_modules/lodash.zip": { + "version": "4.2.0", "dev": true, "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -7681,7 +5302,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -7691,18 +5314,12 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7728,48 +5345,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -7783,14 +5358,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -7803,17 +5370,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -7831,18 +5387,12 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7850,79 +5400,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -7938,6 +5415,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7953,12 +5431,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -7990,22 +5472,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -8029,23 +5501,19 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -8057,15 +5525,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8080,6 +5539,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -8088,6 +5549,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -8101,18 +5564,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -8131,6 +5588,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8139,6 +5598,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -8146,28 +5607,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -8182,9 +5621,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -8193,14 +5630,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -8277,67 +5706,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, "license": "ISC", "dependencies": { - "wrappy": "1" - } - }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "wrappy": "1" } }, "../../../node_modules/opener": { @@ -8364,68 +5738,12 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/p-cancelable": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -8458,34 +5776,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -8504,6 +5800,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -8515,6 +5813,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -8527,6 +5827,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -8539,6 +5841,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -8547,15 +5851,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -8567,46 +5862,10 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -8633,6 +5892,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -8649,19 +5909,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -8700,96 +5947,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/pkg-types": { "version": "1.0.3", "dev": true, @@ -8937,15 +6094,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -8972,12 +6120,17 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -8986,30 +6139,12 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -9028,6 +6163,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -9039,6 +6176,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -9051,6 +6190,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -9063,6 +6204,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -9070,7 +6213,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -9080,6 +6225,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -9096,6 +6243,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -9119,12 +6268,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -9151,14 +6304,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -9182,12 +6335,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -9195,64 +6352,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -9260,7 +6369,10 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -9273,16 +6385,24 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -9291,6 +6411,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9298,28 +6420,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -9336,26 +6436,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -9455,14 +6535,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, @@ -9470,6 +6542,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -9486,26 +6559,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -9527,6 +6583,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -9541,6 +6599,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -9548,35 +6608,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" - } + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -9590,7 +6624,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -9676,17 +6712,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -9712,7 +6737,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -9777,8 +6804,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -9790,6 +6815,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -9803,23 +6830,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -9830,164 +6840,43 @@ "semver": "bin/semver.js" }, "engines": { - "node": ">=10" - } - }, - "../../../node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serialize-error": { - "version": "11.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/serialize-javascript": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", + "../../../node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=10" } }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", + "../../../node_modules/serialize-error": { + "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^2.12.2" + }, "engines": { - "node": ">= 0.6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/serve-static": { - "version": "1.15.0", + "../../../node_modules/serialize-javascript": { + "version": "6.0.2", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" + "randombytes": "^2.1.0" } }, "../../../node_modules/set-function-length": { @@ -10021,12 +6910,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" - }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -10047,10 +6933,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -10068,14 +6950,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -10104,11 +6978,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -10122,61 +6991,23 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "../../../node_modules/smart-buffer": { "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" } }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "../../../node_modules/socks": { "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -10190,6 +7021,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -10203,6 +7036,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -10210,15 +7045,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -10235,56 +7065,19 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -10292,189 +7085,43 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { - "version": "1.18.0", - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", + "version": "1.18.0", "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "../../../node_modules/statuses": { - "version": "2.0.1", + "../../../node_modules/stackback": { + "version": "0.0.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -10486,6 +7133,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -10493,14 +7142,20 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -10666,21 +7321,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -10692,20 +7332,9 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -10714,97 +7343,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "../../../node_modules/symbol-tree": { "version": "3.2.4", "license": "MIT" }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/tapable": { "version": "2.2.1", "dev": true, @@ -10817,6 +7359,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -10830,31 +7374,20 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -10872,6 +7405,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -10904,7 +7439,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -10914,38 +7451,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" - }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -10979,14 +7487,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -10999,8 +7499,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -11015,8 +7513,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -11027,18 +7523,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" - }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -11065,7 +7552,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -11174,6 +7663,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -11181,18 +7672,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -11254,10 +7733,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -11293,6 +7768,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -11316,6 +7793,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -11330,24 +7809,16 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -11379,6 +7850,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -11401,8 +7874,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -11411,40 +7882,22 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } }, "../../../node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" - }, - "../../../node_modules/utila": { - "version": "0.4.0", "dev": true, "license": "MIT" }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { - "version": "3.4.0", - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, + "version": "3.4.0", "license": "MIT", - "engines": { - "node": ">= 0.8" + "bin": { + "uuid": "bin/uuid" } }, "../../../node_modules/verror": { @@ -11662,10 +8115,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -11677,8 +8126,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -11690,6 +8137,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -11706,6 +8155,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -11714,26 +8165,12 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -11742,6 +8179,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -11763,6 +8202,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -11805,8 +8246,6 @@ "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=10.4" } @@ -11815,6 +8254,8 @@ "version": "5.90.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -11927,260 +8368,6 @@ } } }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "../../../node_modules/webpack-merge": { "version": "5.10.0", "dev": true, @@ -12194,19 +8381,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12219,6 +8399,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -12227,6 +8409,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -12235,31 +8419,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -12275,8 +8440,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -12346,20 +8509,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, @@ -12484,9 +8633,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -12495,13 +8642,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -12514,14 +8654,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, @@ -12589,6 +8721,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -12602,6 +8736,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", diff --git a/examples/vite/vite-project-source/pnpm-lock.yaml b/examples/vite/vite-project-source/pnpm-lock.yaml new file mode 100644 index 0000000000..2f65afc1b4 --- /dev/null +++ b/examples/vite/vite-project-source/pnpm-lock.yaml @@ -0,0 +1,1722 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../.. + version: file:../../.. + devDependencies: + vite: + specifier: ^5.3.4 + version: 5.4.14 + +packages: + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.34.2': + resolution: {integrity: sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.34.2': + resolution: {integrity: sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.34.2': + resolution: {integrity: sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.34.2': + resolution: {integrity: sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.34.2': + resolution: {integrity: sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.34.2': + resolution: {integrity: sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': + resolution: {integrity: sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.34.2': + resolution: {integrity: sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.34.2': + resolution: {integrity: sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.34.2': + resolution: {integrity: sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': + resolution: {integrity: sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': + resolution: {integrity: sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.34.2': + resolution: {integrity: sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.34.2': + resolution: {integrity: sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.34.2': + resolution: {integrity: sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.34.2': + resolution: {integrity: sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.34.2': + resolution: {integrity: sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.34.2': + resolution: {integrity: sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.34.2': + resolution: {integrity: sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==} + cpu: [x64] + os: [win32] + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + 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'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neuroglancer@file:../../..: + resolution: {directory: ../../.., type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + 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'} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + rollup@4.34.2: + resolution: {integrity: sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + 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'} + + 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'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + 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 + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.34.2': + optional: true + + '@rollup/rollup-android-arm64@4.34.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.34.2': + optional: true + + '@rollup/rollup-darwin-x64@4.34.2': + optional: true + + '@rollup/rollup-freebsd-arm64@4.34.2': + optional: true + + '@rollup/rollup-freebsd-x64@4.34.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.34.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.34.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.34.2': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.34.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.34.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.34.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.34.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.34.2': + optional: true + + '@types/estree@1.0.6': {} + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.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: {} + + array-equal@1.0.2: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + browser-process-hrtime@1.0.0: {} + + caseless@0.12.0: {} + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + esprima@4.0.1: {} + + estraverse@4.3.0: {} + + esutils@2.0.3: {} + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fflate@0.8.2: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fsevents@2.3.3: + optional: true + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ini@1.3.8: {} + + is-buffer@1.1.6: {} + + is-extendable@0.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + isexe@2.0.0: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-schema-traverse@0.4.1: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lru-cache@10.4.3: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + nanoid@3.3.8: {} + + neuroglancer@file:../../..: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + package-json-from-dist@1.0.1: {} + + parse5@4.0.0: {} + + path-key@3.1.1: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + pn@1.1.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.1.2: {} + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + proto-list@1.2.4: {} + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.5.3: {} + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + rollup@4.34.2: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.34.2 + '@rollup/rollup-android-arm64': 4.34.2 + '@rollup/rollup-darwin-arm64': 4.34.2 + '@rollup/rollup-darwin-x64': 4.34.2 + '@rollup/rollup-freebsd-arm64': 4.34.2 + '@rollup/rollup-freebsd-x64': 4.34.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.2 + '@rollup/rollup-linux-arm-musleabihf': 4.34.2 + '@rollup/rollup-linux-arm64-gnu': 4.34.2 + '@rollup/rollup-linux-arm64-musl': 4.34.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.2 + '@rollup/rollup-linux-riscv64-gnu': 4.34.2 + '@rollup/rollup-linux-s390x-gnu': 4.34.2 + '@rollup/rollup-linux-x64-gnu': 4.34.2 + '@rollup/rollup-linux-x64-musl': 4.34.2 + '@rollup/rollup-win32-arm64-msvc': 4.34.2 + '@rollup/rollup-win32-ia32-msvc': 4.34.2 + '@rollup/rollup-win32-x64-msvc': 4.34.2 + fsevents: 2.3.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + source-map-js@1.2.1: {} + + source-map@0.6.1: + optional: true + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + stealthy-require@1.1.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 + + symbol-tree@3.2.4: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + uuid@3.4.0: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + vite@5.4.14: + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.34.2 + optionalDependencies: + fsevents: 2.3.3 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + webidl-conversions@4.0.2: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/vite/vite-project-source/vite.config.ts b/examples/vite/vite-project-source/vite.config.ts index b8be9b45a4..48d362f3d0 100644 --- a/examples/vite/vite-project-source/vite.config.ts +++ b/examples/vite/vite-project-source/vite.config.ts @@ -11,6 +11,10 @@ export default defineConfig({ "neuroglancer/datasource/precomputed:enabled", ], }, + esbuild: { + // Needed to acommodate decorator usage in Neuroglancer TypeScript sources. + target: "es2022", + }, worker: { // Required due to use of dynamic imports in Neuroglancer. format: "es", @@ -23,8 +27,25 @@ export default defineConfig({ fs: { // Allow serving files from parent neuroglancer project, due to the local // path reference. This would not be needed for projects that depend on - // Neuroglancer normally. + // Neuroglancer normally, or when using pnpm rather than npm. allow: ["../../.."], }, }, + optimizeDeps: { + entries: [ + "index.html", + // In order for Vite to properly find all of Neuroglancer's transitive + // dependencies, instruct Vite to search for dependencies starting from + // all of the bundle entry points. + // + // These have to be specified explicitly because vite does not allow globs + // within `node_modules`. + "node_modules/neuroglancer/src/main.bundle.js", + "node_modules/neuroglancer/src/async_computation.bundle.js", + "node_modules/neuroglancer/src/chunk_worker.bundle.js", + ], + // Neuroglancer is incompatible with Vite's optimizeDeps step used for the + // dev server due to its use of `new URL` syntax (not supported by esbuild). + exclude: ["neuroglancer"], + }, }); diff --git a/examples/webpack/webpack-project-built/package-lock.json b/examples/webpack/webpack-project-built/package-lock.json index 281acb7b1f..f3f9048a90 100644 --- a/examples/webpack/webpack-project-built/package-lock.json +++ b/examples/webpack/webpack-project-built/package-lock.json @@ -15,7 +15,6 @@ "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" @@ -26,16 +25,18 @@ "version": "2.40.1", "license": "Apache-2.0", "dependencies": { + "@playwright/test": "^1.50.1", "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@discoveryjs/json-ext": { @@ -735,14 +736,6 @@ "dev": true, "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, @@ -1349,14 +1342,6 @@ "dev": true, "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/encodeurl": { "version": "1.0.2", "dev": true, @@ -2307,17 +2292,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -2343,19 +2317,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -2505,14 +2466,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -2624,14 +2577,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -3438,11 +3383,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sockjs": { "version": "0.3.24", "dev": true, @@ -3696,16 +3636,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/webpack/webpack-project-built/package.json b/examples/webpack/webpack-project-built/package.json index 8daf28813b..a56db8a6ec 100644 --- a/examples/webpack/webpack-project-built/package.json +++ b/examples/webpack/webpack-project-built/package.json @@ -20,7 +20,6 @@ "css-loader": "^7.1.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" diff --git a/examples/webpack/webpack-project-built/pnpm-lock.yaml b/examples/webpack/webpack-project-built/pnpm-lock.yaml new file mode 100644 index 0000000000..6cef43876a --- /dev/null +++ b/examples/webpack/webpack-project-built/pnpm-lock.yaml @@ -0,0 +1,3938 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../../dist/package + version: file:../../../dist/package + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(webpack@5.97.1) + html-webpack-plugin: + specifier: ^5.6.0 + version: 5.6.3(webpack@5.97.1) + style-loader: + specifier: ^4.0.0 + version: 4.0.0(webpack@5.97.1) + webpack: + specifier: ^5.93.0 + version: 5.97.1(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + webpack-dev-server: + specifier: ^5.0.4 + version: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + +packages: + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.5.14': + resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.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'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + 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-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.91: + resolution: {integrity: sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.9: + resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + + http-proxy-middleware@2.0.7: + resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + neuroglancer@file:../../../dist/package: + resolution: {directory: ../../../dist/package, type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.0.0: + resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + 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'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + 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'} + + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.0: + resolution: {integrity: sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@discoveryjs/json-ext@0.5.7': {} + + '@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 + + '@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/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@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 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.13.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.13.1 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.6 + '@types/node': 22.13.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.13.1 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.6': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.15': + dependencies: + '@types/node': 22.13.1 + + '@types/json-schema@7.0.15': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.13.1 + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.2': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.13.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.13.1 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.13.1 + + '@types/ws@8.5.14': + dependencies: + '@types/node': 22.13.1 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.0)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + optionalDependencies: + webpack-dev-server: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-html-community@0.0.8: {} + + 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: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-equal@1.0.2: {} + + array-flatten@1.1.1: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.91 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@8.3.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@7.1.2(webpack@5.97.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.1) + postcss-modules-scope: 3.2.1(postcss@8.5.1) + postcss-modules-values: 4.0.0(postcss@8.5.1) + postcss-value-parser: 4.2.0 + semver: 7.7.1 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.91: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@2.2.0: {} + + envinfo@7.14.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handle-thing@2.0.1: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.37.0 + + html-webpack-plugin@5.6.3(webpack@5.97.1): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.9: {} + + http-proxy-middleware@2.0.7(@types/express@4.17.21): + dependencies: + '@types/http-proxy': 1.17.15 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.21 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@1.1.6: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-network-error@1.1.0: {} + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.13.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@6.0.3: {} + + launch-editor@2.9.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + loader-runner@4.3.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memfs@4.17.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + nanoid@3.3.8: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + neuroglancer@file:../../../dist/package: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-inspect@1.13.3: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parse5@4.0.0: {} + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pn@1.1.0: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-selector-parser: 7.0.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + postcss-selector-parser: 7.0.0 + + postcss-modules-values@4.0.0(postcss@8.5.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + + postcss-selector-parser@7.0.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.1.2: {} + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + process-nextick-args@2.0.1: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + relateurl@0.2.7: {} + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + run-applescript@7.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.0 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.0 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + stealthy-require@1.1.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 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + style-loader@4.0.0(webpack@5.97.1): + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.11(webpack@5.97.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.97.1(webpack-cli@5.1.4) + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thunky@1.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utils-merge@1.0.1: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webidl-conversions@4.0.2: {} + + webpack-cli@5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.97.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.97.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.0)(webpack@5.97.1) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + optionalDependencies: + webpack-dev-server: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + + webpack-dev-middleware@7.4.2(webpack@5.97.1): + dependencies: + colorette: 2.0.20 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.0 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + webpack-dev-server@5.2.0(webpack-cli@5.1.4)(webpack@5.97.1): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.14 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.1 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.97.1) + ws: 8.18.0 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@3.2.3: {} + + webpack@5.97.1(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(webpack@5.97.1) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.9 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + ws@8.18.0: {} + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/examples/webpack/webpack-project-source/package-lock.json b/examples/webpack/webpack-project-source/package-lock.json index 2c9d8f5e54..31a5c4d92c 100644 --- a/examples/webpack/webpack-project-source/package-lock.json +++ b/examples/webpack/webpack-project-source/package-lock.json @@ -16,7 +16,6 @@ "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "webpack": "^5.93.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^5.0.4" @@ -26,52 +25,63 @@ "version": "2.40.1", "license": "Apache-2.0", "dependencies": { + "@playwright/test": "^1.50.1", "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", "nifti-reader-js": "^0.6.8", "numcodecs": "^0.3.2" }, "devDependencies": { + "@eslint/js": "^9.18.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.49.1", + "@rspack/cli": "^1.1.8", + "@rspack/core": "^1.1.8", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.10.7", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.2", + "@vitest/ui": "^3.0.2", + "@vitest/web-worker": "^3.0.2", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", + "esbuild": "^0.24.2", + "eslint": "^9.18.0", "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.7", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.7", + "playwright": "^1.49.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.20.0", + "vitest": "^3.0.2", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "../../../node_modules/@aashutoshrathi/word-wrap": { @@ -82,99 +92,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "../../../node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight": { - "version": "7.23.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "../../../node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "dev": true, @@ -721,26 +638,12 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/@jest/types": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -754,6 +657,8 @@ "version": "3.1.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -762,6 +667,8 @@ "version": "1.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -770,6 +677,8 @@ "version": "0.3.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -784,16 +693,13 @@ "version": "0.3.25", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "../../../node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -847,6 +753,8 @@ "version": "2.0.1", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", @@ -1080,6 +988,8 @@ "version": "5.6.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -1091,6 +1001,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -1102,8 +1014,6 @@ "version": "1.1.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 6" } @@ -1111,24 +1021,9 @@ "../../../node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "../../../node_modules/@types/bonjour": { - "version": "3.5.13", - "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/codemirror": { "version": "5.60.15", @@ -1138,27 +1033,12 @@ "@types/tern": "*" } }, - "../../../node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, "../../../node_modules/@types/eslint": { "version": "8.56.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -1168,6 +1048,8 @@ "version": "3.7.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -1178,81 +1060,24 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "../../../node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, "../../../node_modules/@types/gl-matrix": { "version": "2.4.5", "dev": true, "license": "MIT" }, - "../../../node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/http-cache-semantics": { "version": "4.0.4", "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/http-proxy": { - "version": "1.17.14", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "../../../node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } + "optional": true, + "peer": true }, "../../../node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@types/json5": { "version": "0.0.29", @@ -1272,11 +1097,6 @@ "@types/lodash": "*" } }, - "../../../node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT" - }, "../../../node_modules/@types/node": { "version": "20.11.20", "dev": true, @@ -1285,301 +1105,56 @@ "undici-types": "~5.26.4" } }, - "../../../node_modules/@types/node-forge": { - "version": "1.3.11", + "../../../node_modules/@types/tern": { + "version": "0.23.9", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/estree": "*" } }, - "../../../node_modules/@types/parse-json": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/qs": { - "version": "6.9.12", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/retry": { - "version": "0.12.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/semver": { - "version": "7.5.7", + "../../../node_modules/@types/which": { + "version": "2.0.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, - "../../../node_modules/@types/send": { - "version": "0.17.4", + "../../../node_modules/@types/ws": { + "version": "8.5.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@types/mime": "^1", "@types/node": "*" } }, - "../../../node_modules/@types/serve-index": { - "version": "1.9.4", + "../../../node_modules/@types/yargs": { + "version": "17.0.32", "dev": true, "license": "MIT", "dependencies": { - "@types/express": "*" + "@types/yargs-parser": "*" } }, - "../../../node_modules/@types/serve-static": { - "version": "1.15.5", + "../../../node_modules/@types/yargs-parser": { + "version": "21.0.3", "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } + "license": "MIT" }, - "../../../node_modules/@types/sockjs": { - "version": "0.3.36", + "../../../node_modules/@types/yauzl": { + "version": "2.10.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } }, - "../../../node_modules/@types/tern": { - "version": "0.23.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "../../../node_modules/@types/which": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/ws": { - "version": "8.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@types/yargs": { - "version": "17.0.32", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "../../../node_modules/@types/yargs-parser": { - "version": "21.0.3", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/@types/yauzl": { - "version": "2.10.3", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "../../../node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/type-utils": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/parser": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/scope-manager": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/type-utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.0.2", - "@typescript-eslint/utils": "7.0.2", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/types": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@typescript-eslint/typescript-estree": { - "version": "7.0.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/visitor-keys": "7.0.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "../../../node_modules/@typescript-eslint/utils": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.0.2", - "@typescript-eslint/types": "7.0.2", - "@typescript-eslint/typescript-estree": "7.0.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "../../../node_modules/@typescript-eslint/visitor-keys": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.0.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "../../../node_modules/@ungap/structured-clone": { - "version": "1.2.0", + "../../../node_modules/@ungap/structured-clone": { + "version": "1.2.0", "dev": true, "license": "ISC" }, @@ -1733,6 +1308,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "8.28.0", "@wdio/types": "8.32.2", @@ -1750,6 +1327,8 @@ "version": "8.28.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.1.2", "loglevel": "^1.6.0", @@ -1764,6 +1343,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -1775,6 +1356,8 @@ "version": "5.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -1786,6 +1369,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -1799,12 +1384,16 @@ "../../../node_modules/@wdio/protocols": { "version": "8.32.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@wdio/repl": { "version": "8.24.12", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1816,6 +1405,8 @@ "version": "8.32.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0" }, @@ -1827,6 +1418,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "^1.6.0", "@wdio/logger": "8.28.0", @@ -1850,6 +1443,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1858,22 +1453,30 @@ "../../../node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1883,12 +1486,16 @@ "../../../node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1900,6 +1507,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1908,6 +1517,8 @@ "version": "1.11.6", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -1915,12 +1526,16 @@ "../../../node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1936,6 +1551,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -1948,6 +1565,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -1959,6 +1578,8 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1972,69 +1593,32 @@ "version": "1.11.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, - "../../../node_modules/@webpack-cli/configtest": { - "version": "2.1.1", + "../../../node_modules/@xtuc/ieee754": { + "version": "1.2.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, - "../../../node_modules/@webpack-cli/info": { - "version": "2.0.2", + "../../../node_modules/@xtuc/long": { + "version": "4.2.2", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } + "license": "Apache-2.0", + "optional": true, + "peer": true }, - "../../../node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/@xtuc/ieee754": { - "version": "1.2.0", + "../../../node_modules/abab": { + "version": "2.0.6", "dev": true, "license": "BSD-3-Clause" }, - "../../../node_modules/@xtuc/long": { - "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "../../../node_modules/abab": { - "version": "2.0.6", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true - }, "../../../node_modules/abbrev": { "version": "2.0.0", "license": "ISC", @@ -2042,18 +1626,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "../../../node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/acorn": { "version": "8.11.3", "dev": true, @@ -2069,8 +1641,6 @@ "version": "6.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" @@ -2080,8 +1650,6 @@ "version": "7.4.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2093,6 +1661,8 @@ "version": "1.9.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "acorn": "^8" } @@ -2109,8 +1679,6 @@ "version": "7.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=0.4.0" } @@ -2119,8 +1687,6 @@ "version": "6.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "debug": "4" }, @@ -2142,120 +1708,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "../../../node_modules/ajv-formats": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "../../../node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ajv": "^6.9.1" } }, - "../../../node_modules/ansi-align": { - "version": "3.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "../../../node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/ansi-escapes": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ansi-html-community": { - "version": "0.0.8", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "../../../node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -2276,22 +1738,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "../../../node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "../../../node_modules/archiver": { "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "async": "^3.2.4", @@ -2309,6 +1761,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob": "^8.0.0", "graceful-fs": "^4.2.0", @@ -2325,6 +1779,8 @@ "version": "8.1.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2343,6 +1799,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -2354,6 +1812,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2367,6 +1827,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2385,6 +1847,8 @@ "version": "5.3.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -2408,11 +1872,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/array-includes": { "version": "3.1.7", "dev": true, @@ -2431,14 +1890,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/array.prototype.findlastindex": { "version": "1.2.3", "dev": true, @@ -2537,6 +1988,8 @@ "version": "0.13.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.0.1" }, @@ -2544,18 +1997,12 @@ "node": ">=4" } }, - "../../../node_modules/astral-regex": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/async": { "version": "3.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/async-limiter": { "version": "1.0.1", @@ -2565,14 +2012,6 @@ "version": "0.4.0", "license": "MIT" }, - "../../../node_modules/at-least-node": { - "version": "1.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, "../../../node_modules/available-typed-arrays": { "version": "1.0.5", "dev": true, @@ -2598,7 +2037,9 @@ "../../../node_modules/b4a": { "version": "1.6.4", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/balanced-match": { "version": "1.0.2", @@ -2608,13 +2049,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-fs": { "version": "2.1.5", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -2626,13 +2069,15 @@ "version": "2.2.0", "dev": true, "license": "Apache-2.0", - "optional": true + "optional": true, + "peer": true }, "../../../node_modules/bare-path": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -2654,21 +2099,20 @@ "url": "https://feross.org/support" } ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/basic-ftp": { "version": "5.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" } }, - "../../../node_modules/batch": { - "version": "0.6.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/bcrypt-pbkdf": { "version": "1.0.2", "license": "BSD-3-Clause", @@ -2680,204 +2124,46 @@ "version": "1.6.52", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } }, - "../../../node_modules/big.js": { - "version": "5.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "../../../node_modules/binary": { "version": "0.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffers": "~0.1.1", "chainsaw": "~0.1.0" } }, - "../../../node_modules/binary-extensions": { - "version": "2.2.0", + "../../../node_modules/bluebird": { + "version": "3.4.7", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, - "../../../node_modules/bl": { - "version": "5.1.0", - "dev": true, + "../../../node_modules/brace-expansion": { + "version": "2.0.1", "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "balanced-match": "^1.0.0" } }, - "../../../node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", + "../../../node_modules/braces": { + "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "fill-range": "^7.0.1" }, "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/bluebird": { - "version": "3.4.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser": { - "version": "1.20.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "../../../node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/bonjour-service": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "../../../node_modules/boolbase": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/boxen": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "../../../node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/brfs": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "../../../node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node": ">=8" } }, "../../../node_modules/browser-process-hrtime": { @@ -2902,6 +2188,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001587", "electron-to-chromium": "^1.4.668", @@ -2915,29 +2203,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "../../../node_modules/buffer": { - "version": "6.0.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "../../../node_modules/buffer-crc32": { "version": "0.2.13", "dev": true, @@ -2946,21 +2211,19 @@ "node": "*" } }, - "../../../node_modules/buffer-equal": { - "version": "0.0.1", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/buffer-indexof-polyfill": { "version": "1.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10" } @@ -2968,32 +2231,12 @@ "../../../node_modules/buffers": { "version": "0.1.1", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.2.0" } }, - "../../../node_modules/bundle-name": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/bytes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/cac": { "version": "6.7.14", "dev": true, @@ -3006,6 +2249,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" } @@ -3014,6 +2259,8 @@ "version": "10.2.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", @@ -3031,6 +2278,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3059,26 +2308,6 @@ "node": ">=6" } }, - "../../../node_modules/camel-case": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "../../../node_modules/camelcase": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/caniuse-lite": { "version": "1.0.30001596", "dev": true, @@ -3096,7 +2325,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "CC-BY-4.0" + "license": "CC-BY-4.0", + "optional": true, + "peer": true }, "../../../node_modules/caseless": { "version": "0.12.0", @@ -3123,6 +2354,8 @@ "version": "0.1.0", "dev": true, "license": "MIT/X11", + "optional": true, + "peer": true, "dependencies": { "traverse": ">=0.3.0 <0.4" } @@ -3153,44 +2386,12 @@ "node": "*" } }, - "../../../node_modules/chokidar": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "../../../node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0" } @@ -3199,6 +2400,8 @@ "version": "0.4.16", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "mitt": "3.0.0" }, @@ -3206,69 +2409,8 @@ "devtools-protocol": "*" } }, - "../../../node_modules/ci-info": { - "version": "3.9.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/clean-css": { - "version": "5.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "../../../node_modules/cli-boxes": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cli-spinners": { - "version": "2.9.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/cliui": { - "version": "8.0.1", + "../../../node_modules/cliui": { + "version": "8.0.1", "dev": true, "license": "ISC", "dependencies": { @@ -3353,11 +2495,6 @@ "version": "1.1.4", "license": "MIT" }, - "../../../node_modules/colorette": { - "version": "2.0.20", - "dev": true, - "license": "MIT" - }, "../../../node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", @@ -3368,28 +2505,22 @@ "node": ">= 0.8" } }, - "../../../node_modules/comlink": { - "version": "4.4.1", - "dev": true, - "license": "Apache-2.0" - }, "../../../node_modules/commander": { "version": "9.5.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || >=14" } }, - "../../../node_modules/common-path-prefix": { - "version": "3.0.0", - "dev": true, - "license": "ISC" - }, "../../../node_modules/compress-commons": { "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^5.0.0", @@ -3404,6 +2535,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3413,70 +2546,11 @@ "node": ">= 6" } }, - "../../../node_modules/compressible": { - "version": "2.0.18", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/compression": { - "version": "1.7.4", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/concat-map": { "version": "0.0.1", "dev": true, "license": "MIT" }, - "../../../node_modules/concat-stream": { - "version": "1.6.2", - "engines": [ - "node >= 0.8" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "../../../node_modules/condense-newlines": { "version": "0.2.1", "license": "MIT", @@ -3501,73 +2575,15 @@ "version": "1.3.8", "license": "ISC" }, - "../../../node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "../../../node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, "../../../node_modules/core-util-is": { "version": "1.0.3", - "license": "MIT" - }, - "../../../node_modules/cosmiconfig": { - "version": "6.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/crc-32": { "version": "1.2.2", - "dev": true, "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" @@ -3580,6 +2596,8 @@ "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "crc-32": "^1.2.0", "readable-stream": "^3.4.0" @@ -3592,6 +2610,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3605,6 +2625,8 @@ "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.6.12" } @@ -3613,6 +2635,8 @@ "version": "2.7.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -3631,17 +2655,23 @@ "../../../node_modules/cross-fetch/node_modules/tr46": { "version": "0.0.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/webidl-conversions": { "version": "3.0.1", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/cross-fetch/node_modules/whatwg-url": { "version": "5.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -3693,39 +2723,17 @@ } } }, - "../../../node_modules/css-select": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "../../../node_modules/css-shorthand-properties": { "version": "1.1.1", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "../../../node_modules/css-value": { "version": "0.0.1", - "dev": true - }, - "../../../node_modules/css-what": { - "version": "6.1.0", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } + "optional": true, + "peer": true }, "../../../node_modules/cssesc": { "version": "3.0.0", @@ -3741,16 +2749,12 @@ "../../../node_modules/cssom": { "version": "0.5.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "cssom": "~0.3.6" }, @@ -3761,9 +2765,7 @@ "../../../node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/dashdash": { "version": "1.14.1", @@ -3779,6 +2781,8 @@ "version": "4.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 12" } @@ -3787,8 +2791,6 @@ "version": "3.0.2", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", @@ -3802,8 +2804,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -3815,8 +2815,6 @@ "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3825,8 +2823,6 @@ "version": "3.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" } @@ -3835,8 +2831,6 @@ "version": "11.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" @@ -3870,6 +2864,8 @@ "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -3880,14 +2876,14 @@ "../../../node_modules/decimal.js": { "version": "10.4.3", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/decompress-response": { "version": "6.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -3902,6 +2898,8 @@ "version": "3.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -3924,147 +2922,22 @@ "version": "0.1.4", "license": "MIT" }, - "../../../node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/deepmerge-ts": { "version": "5.1.0", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=16.0.0" } }, - "../../../node_modules/default-browser": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-browser-id": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "../../../node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "../../../node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "../../../node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/defaults": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "../../../node_modules/defer-to-connect": { - "version": "2.0.1", + "../../../node_modules/defer-to-connect": { + "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" } @@ -4082,17 +2955,6 @@ "node": ">= 0.4" } }, - "../../../node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/define-properties": { "version": "1.2.1", "dev": true, @@ -4113,6 +2975,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -4129,31 +2993,16 @@ "node": ">=0.4.0" } }, - "../../../node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/dequal": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6" } }, - "../../../node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "../../../node_modules/detect-libc": { "version": "1.0.3", "dev": true, @@ -4167,15 +3016,12 @@ "node": ">=0.10" } }, - "../../../node_modules/detect-node": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/devtools-protocol": { "version": "0.0.1262051", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/diff-sequences": { "version": "29.6.3", @@ -4185,28 +3031,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "../../../node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/dns-packet": { - "version": "5.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/doctrine": { "version": "3.0.0", "dev": true, @@ -4218,44 +3042,10 @@ "node": ">=6.0.0" } }, - "../../../node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "../../../node_modules/dom-serializer": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "../../../node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, "../../../node_modules/domexception": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "webidl-conversions": "^5.0.0" }, @@ -4267,48 +3057,10 @@ "version": "5.0.0", "dev": true, "license": "BSD-2-Clause", - "optional": true, - "peer": true, "engines": { "node": ">=8" } }, - "../../../node_modules/domhandler": { - "version": "4.3.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "../../../node_modules/domutils": { - "version": "2.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "../../../node_modules/dot-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/duplexer": { "version": "0.1.2", "dev": true, @@ -4316,7 +3068,10 @@ }, "../../../node_modules/duplexer2": { "version": "0.1.4", + "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.2" } @@ -4337,6 +3092,8 @@ "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/which": "^2.0.1", "which": "^2.0.2" @@ -4353,6 +3110,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -4369,6 +3128,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -4377,6 +3138,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -4423,44 +3186,23 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/electron-to-chromium": { "version": "1.4.699", "dev": true, - "license": "ISC" - }, - "../../../node_modules/element-size": { - "version": "1.1.1", - "license": "MIT" + "license": "ISC", + "optional": true, + "peer": true }, "../../../node_modules/emoji-regex": { "version": "9.2.2", "license": "MIT" }, - "../../../node_modules/emojis-list": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "../../../node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/end-of-stream": { "version": "1.4.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4477,45 +3219,6 @@ "node": ">=10.13.0" } }, - "../../../node_modules/enquirer": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "../../../node_modules/entities": { - "version": "2.2.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "../../../node_modules/envinfo": { - "version": "7.11.1", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/error-ex": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "../../../node_modules/es-abstract": { "version": "1.22.3", "dev": true, @@ -4571,7 +3274,9 @@ "../../../node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -4647,23 +3352,6 @@ "@esbuild/win32-x64": "0.20.1" } }, - "../../../node_modules/esbuild-loader": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.20.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, "../../../node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { "version": "0.20.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", @@ -5024,11 +3712,6 @@ "node": ">=6" } }, - "../../../node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, @@ -5042,6 +3725,7 @@ }, "../../../node_modules/escodegen": { "version": "2.1.0", + "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", @@ -5113,18 +3797,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "../../../node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, @@ -5167,71 +3839,6 @@ "eslint-plugin-import": "*" } }, - "../../../node_modules/eslint-interactive": { - "version": "10.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" - }, - "bin": { - "eslint-interactive": "bin/eslint-interactive.js" - }, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "../../../node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, @@ -5359,106 +3966,6 @@ "url": "https://opencollective.com/eslint" } }, - "../../../node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "../../../node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -5530,6 +4037,7 @@ }, "../../../node_modules/estraverse": { "version": "5.3.0", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -5542,26 +4050,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/eventemitter3": { - "version": "4.0.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/events": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">=0.4.x" - } - }, "../../../node_modules/execa": { "version": "8.0.1", "dev": true, @@ -5634,93 +4122,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "../../../node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "../../../node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "../../../node_modules/extract-zip": { + "version": "2.0.1", "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "../../../node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/express/node_modules/qs": { - "version": "6.11.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "../../../node_modules/extend": { - "version": "3.0.2", - "license": "MIT" - }, - "../../../node_modules/extend-shallow": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", + "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -5740,6 +4161,8 @@ "version": "5.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "pump": "^3.0.0" }, @@ -5757,27 +4180,6 @@ ], "license": "MIT" }, - "../../../node_modules/falafel": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "../../../node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" @@ -5785,7 +4187,9 @@ "../../../node_modules/fast-fifo": { "version": "1.3.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/fast-glob": { "version": "3.3.2", @@ -5821,14 +4225,6 @@ "version": "2.0.6", "license": "MIT" }, - "../../../node_modules/fastest-levenshtein": { - "version": "1.0.16", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, "../../../node_modules/fastq": { "version": "1.17.0", "dev": true, @@ -5837,17 +4233,6 @@ "reusify": "^1.0.4" } }, - "../../../node_modules/faye-websocket": { - "version": "0.11.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/fd-slicer": { "version": "1.1.0", "dev": true, @@ -5870,6 +4255,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -5904,51 +4291,6 @@ "node": ">=8" } }, - "../../../node_modules/finalhandler": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/find-cache-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/find-up": { "version": "5.0.0", "dev": true, @@ -5990,26 +4332,6 @@ "dev": true, "license": "ISC" }, - "../../../node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "../../../node_modules/for-each": { "version": "0.3.3", "dev": true, @@ -6039,316 +4361,92 @@ "node": "*" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", + "../../../node_modules/form-data": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "node": ">= 6" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", + "../../../node_modules/form-data-encoder": { + "version": "2.1.4", "dev": true, "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=6.9.0" + "node": ">= 14.17" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", + "../../../node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=4" + "node": ">=12.20.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", + "../../../node_modules/fs-extra": { + "version": "11.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "color-convert": "^1.9.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=14.14" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", + "../../../node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", "dev": true, "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", + "../../../node_modules/fs.realpath": { + "version": "1.0.0", "dev": true, - "license": "MIT" + "license": "ISC" }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", + "../../../node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "MIT", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", + "../../../node_modules/fstream": { + "version": "1.0.12", "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "../../../node_modules/form-data-encoder": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.17" - } - }, - "../../../node_modules/formdata-polyfill": { - "version": "4.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "../../../node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "../../../node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "../../../node_modules/fs-monkey": { - "version": "1.0.5", - "dev": true, - "license": "Unlicense" - }, - "../../../node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "../../../node_modules/fstream": { - "version": "1.0.12", - "dev": true, - "license": "ISC", + "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -6363,6 +4461,8 @@ "version": "1.1.11", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6372,6 +4472,8 @@ "version": "7.2.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6391,6 +4493,8 @@ "version": "3.1.2", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -6402,6 +4506,8 @@ "version": "2.7.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -6411,6 +4517,7 @@ }, "../../../node_modules/function-bind": { "version": "1.1.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6446,6 +4553,8 @@ "dev": true, "hasInstallScript": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@wdio/logger": "^8.28.0", "decamelize": "^6.0.0", @@ -6467,6 +4576,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -6478,6 +4589,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -6490,6 +4603,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -6502,6 +4617,8 @@ "version": "3.1.1", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=16" } @@ -6510,6 +4627,8 @@ "version": "4.0.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -6554,6 +4673,8 @@ "version": "7.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -6602,6 +4723,8 @@ "version": "6.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -6616,6 +4739,8 @@ "version": "6.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -6665,21 +4790,9 @@ "../../../node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/global-dirs": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/globals": { "version": "13.24.0", @@ -6720,42 +4833,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/glsl-editor": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" - } - }, - "../../../node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0" - }, "../../../node_modules/gopd": { "version": "1.0.1", "dev": true, @@ -6771,6 +4848,8 @@ "version": "12.6.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", @@ -6795,6 +4874,8 @@ "version": "6.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -6810,7 +4891,9 @@ "../../../node_modules/grapheme-splitter": { "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/graphemer": { "version": "1.4.0", @@ -6831,11 +4914,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/handle-thing": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/har-schema": { "version": "2.0.0", "license": "ISC", @@ -6854,13 +4932,6 @@ "node": ">=6" } }, - "../../../node_modules/has": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/has-bigints": { "version": "1.0.2", "dev": true, @@ -6926,6 +4997,7 @@ }, "../../../node_modules/hasown": { "version": "2.0.0", + "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6934,31 +5006,10 @@ "node": ">= 0.4" } }, - "../../../node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "../../../node_modules/hpack.js": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, "../../../node_modules/html-encoding-sniffer": { "version": "2.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "whatwg-encoding": "^1.0.5" }, @@ -6966,152 +5017,22 @@ "node": ">=10" } }, - "../../../node_modules/html-entities": { - "version": "2.5.2", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, "../../../node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, - "../../../node_modules/html-minifier-terser": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "../../../node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "../../../node_modules/html-webpack-plugin": { - "version": "5.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/htmlparser2": { - "version": "6.1.0", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, "../../../node_modules/http-cache-semantics": { "version": "4.1.1", "dev": true, - "license": "BSD-2-Clause" - }, - "../../../node_modules/http-deceiver": { - "version": "1.2.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/http-parser-js": { - "version": "0.5.8", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/http-proxy": { - "version": "1.18.1", - "dev": true, - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "../../../node_modules/http-proxy-agent": { "version": "4.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -7121,40 +5042,6 @@ "node": ">= 6" } }, - "../../../node_modules/http-proxy-middleware": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "../../../node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/http-signature": { "version": "1.2.0", "license": "MIT", @@ -7172,6 +5059,8 @@ "version": "2.2.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -7184,8 +5073,6 @@ "version": "5.0.1", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -7240,7 +5127,9 @@ "url": "https://feross.org/support" } ], - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/ignore": { "version": "5.3.0", @@ -7508,170 +5397,72 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/import-local": { - "version": "3.1.0", + "../../../node_modules/import-meta-resolve": { + "version": "4.0.0", "dev": true, "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, + "optional": true, + "peer": true, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "../../../node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", + "../../../node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "../../../node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", + "../../../node_modules/inflight": { + "version": "1.0.6", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "once": "^1.3.0", + "wrappy": "1" } }, - "../../../node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", + "../../../node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "../../../node_modules/internal-slot": { + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "../../../node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", + "../../../node_modules/ip-address": { + "version": "9.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "p-limit": "^2.2.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/import-meta-resolve": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "../../../node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "../../../node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "../../../node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "../../../node_modules/ini": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "../../../node_modules/insert-css": { - "version": "0.2.0", - "license": "MIT" - }, - "../../../node_modules/internal-slot": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "../../../node_modules/interpret": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "../../../node_modules/ip-address": { - "version": "9.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" + "node": ">= 12" } }, "../../../node_modules/ip-address/node_modules/jsbn": { "version": "1.1.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/ipaddr.js": { - "version": "2.1.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 10" - } + "optional": true, + "peer": true }, "../../../node_modules/is-array-buffer": { "version": "3.0.2", @@ -7686,11 +5477,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/is-bigint": { "version": "1.0.4", "dev": true, @@ -7702,17 +5488,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-binary-path": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, @@ -7745,6 +5520,7 @@ }, "../../../node_modules/is-core-module": { "version": "2.13.1", + "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" @@ -7767,20 +5543,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-extendable": { "version": "0.1.1", "license": "MIT", @@ -7814,49 +5576,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-installed-globally": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/is-interactive": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -7868,17 +5587,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/is-network-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-number": { "version": "7.0.0", "dev": true, @@ -7913,6 +5621,8 @@ "version": "4.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12" }, @@ -7934,9 +5644,7 @@ "../../../node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/is-regex": { "version": "1.1.4", @@ -8021,17 +5729,6 @@ "version": "1.0.0", "license": "MIT" }, - "../../../node_modules/is-unicode-supported": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -8050,22 +5747,9 @@ "node": ">=0.10.0" } }, - "../../../node_modules/is-wsl": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/isarray": { "version": "2.0.5", + "dev": true, "license": "MIT" }, "../../../node_modules/isexe": { @@ -8100,26 +5784,12 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "../../../node_modules/jest-util": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "../../../node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8133,6 +5803,8 @@ "version": "8.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8161,11 +5833,6 @@ "node": ">=14" } }, - "../../../node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, "../../../node_modules/js-yaml": { "version": "4.1.0", "dev": true, @@ -8185,8 +5852,6 @@ "version": "17.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "abab": "^2.0.5", "acorn": "^8.4.1", @@ -8236,7 +5901,9 @@ "../../../node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/json-schema": { "version": "0.4.0", @@ -8255,17 +5922,6 @@ "version": "5.0.1", "license": "ISC" }, - "../../../node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "../../../node_modules/jsonc-parser": { "version": "3.2.1", "dev": true, @@ -8275,6 +5931,8 @@ "version": "6.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -8286,6 +5944,8 @@ "version": "2.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -8325,6 +5985,8 @@ "version": "0.33.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -8332,19 +5994,12 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "../../../node_modules/launch-editor": { - "version": "2.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, "../../../node_modules/lazystream": { "version": "1.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "readable-stream": "^2.0.5" }, @@ -8436,37 +6091,23 @@ "url": "https://opencollective.com/parcel" } }, - "../../../node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "../../../node_modules/listenercount": { "version": "1.0.1", "dev": true, - "license": "ISC" - }, - "../../../node_modules/loader-runner": { + "license": "ISC", + "optional": true, + "peer": true + }, + "../../../node_modules/loader-runner": { "version": "4.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.11.5" } }, - "../../../node_modules/loader-utils": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "../../../node_modules/local-pkg": { "version": "0.5.0", "dev": true, @@ -8486,6 +6127,8 @@ "version": "2.2.20", "dev": true, "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true, "dependencies": { "n12": "1.8.23", "type-fest": "2.13.0", @@ -8496,6 +6139,8 @@ "version": "2.13.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -8528,7 +6173,9 @@ "../../../node_modules/lodash.clonedeep": { "version": "4.5.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/lodash.merge": { "version": "4.6.2", @@ -8539,46 +6186,19 @@ "version": "4.7.0", "license": "MIT" }, - "../../../node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "../../../node_modules/lodash.zip": { "version": "4.2.0", "dev": true, - "license": "MIT" - }, - "../../../node_modules/log-symbols": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "dev": true, "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "optional": true, + "peer": true }, "../../../node_modules/loglevel": { "version": "1.9.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6.0" }, @@ -8590,7 +6210,9 @@ "../../../node_modules/loglevel-plugin-prefix": { "version": "0.8.4", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/loupe": { "version": "2.3.7", @@ -8600,18 +6222,12 @@ "get-func-name": "^2.0.1" } }, - "../../../node_modules/lower-case": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "../../../node_modules/lowercase-keys": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8637,48 +6253,6 @@ "node": ">=12" } }, - "../../../node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/memfs": { - "version": "4.7.7", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">= 4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "../../../node_modules/merge-descriptors": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/merge-source-map": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "../../../node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/merge-stream": { "version": "2.0.0", "dev": true, @@ -8692,14 +6266,6 @@ "node": ">= 8" } }, - "../../../node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/micromatch": { "version": "4.0.5", "dev": true, @@ -8712,17 +6278,6 @@ "node": ">=8.6" } }, - "../../../node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "../../../node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8740,18 +6295,12 @@ "node": ">= 0.6" } }, - "../../../node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/mimic-response": { "version": "4.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8759,79 +6308,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/minimalistic-assert": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, "../../../node_modules/minimatch": { "version": "9.0.3", "license": "ISC", @@ -8847,6 +6323,7 @@ }, "../../../node_modules/minimist": { "version": "1.2.8", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8862,12 +6339,16 @@ "../../../node_modules/mitt": { "version": "3.0.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/mkdirp": { "version": "0.5.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "minimist": "^1.2.6" }, @@ -8899,22 +6380,12 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/multicast-dns": { - "version": "7.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "../../../node_modules/n12": { "version": "1.8.23", "dev": true, - "license": "SEE LICENSE IN LICENSE" + "license": "SEE LICENSE IN LICENSE", + "optional": true, + "peer": true }, "../../../node_modules/nanoid": { "version": "3.3.7", @@ -8938,23 +6409,19 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/neo-async": { "version": "2.6.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/netmask": { "version": "2.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4.0" } @@ -8966,15 +6433,6 @@ "fflate": "*" } }, - "../../../node_modules/no-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "../../../node_modules/node-domexception": { "version": "1.0.0", "dev": true, @@ -8989,6 +6447,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.5.0" } @@ -8997,6 +6457,8 @@ "version": "3.3.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -9010,18 +6472,12 @@ "url": "https://opencollective.com/node-fetch" } }, - "../../../node_modules/node-forge": { - "version": "1.3.1", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "engines": { - "node": ">= 6.13.0" - } - }, "../../../node_modules/node-releases": { "version": "2.0.14", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/nopt": { "version": "7.2.0", @@ -9040,6 +6496,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9048,6 +6506,8 @@ "version": "8.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.16" }, @@ -9055,28 +6515,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/nth-check": { - "version": "2.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, "../../../node_modules/numcodecs": { "version": "0.3.1", "license": "MIT", @@ -9091,9 +6529,7 @@ "../../../node_modules/nwsapi": { "version": "2.2.7", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/oauth-sign": { "version": "0.9.0", @@ -9102,14 +6538,6 @@ "node": "*" } }, - "../../../node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/object-inspect": { "version": "1.13.1", "dev": true, @@ -9186,30 +6614,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/obuf": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/on-headers": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/once": { "version": "1.4.0", "dev": true, @@ -9218,37 +6622,6 @@ "wrappy": "1" } }, - "../../../node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/open": { - "version": "10.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/opener": { "version": "1.5.2", "dev": true, @@ -9273,68 +6646,12 @@ "node": ">= 0.8.0" } }, - "../../../node_modules/ora": { - "version": "6.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "../../../node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "../../../node_modules/p-cancelable": { "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" } @@ -9367,34 +6684,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/p-retry": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "../../../node_modules/pac-proxy-agent": { "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -9413,6 +6708,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -9424,6 +6721,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -9436,6 +6735,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -9448,6 +6749,8 @@ "version": "7.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -9456,15 +6759,6 @@ "node": ">= 14" } }, - "../../../node_modules/param-case": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "../../../node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -9476,46 +6770,10 @@ "node": ">=6" } }, - "../../../node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/parse5": { "version": "6.0.1", "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "../../../node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/pascal-case": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "license": "MIT" }, "../../../node_modules/path-exists": { "version": "4.0.0", @@ -9542,6 +6800,7 @@ }, "../../../node_modules/path-parse": { "version": "1.0.7", + "dev": true, "license": "MIT" }, "../../../node_modules/path-scurry": { @@ -9558,19 +6817,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/path-to-regexp": { - "version": "0.1.7", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/path-type": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "../../../node_modules/pathe": { "version": "1.1.2", "dev": true, @@ -9610,136 +6856,46 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "../../../node_modules/pkg-dir": { - "version": "7.0.0", + "../../../node_modules/pkg-types": { + "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" } }, - "../../../node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", + "../../../node_modules/pn": { + "version": "1.1.0", + "license": "MIT" + }, + "../../../node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "../../../node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/pkg-types": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "../../../node_modules/pn": { - "version": "1.1.0", - "license": "MIT" - }, - "../../../node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" + "node": "^10 || ^12 || >=14" } }, "../../../node_modules/postcss-modules-extract-imports": { @@ -9848,15 +7004,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/pretty-error": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, "../../../node_modules/pretty-format": { "version": "29.7.0", "dev": true, @@ -9883,12 +7030,17 @@ }, "../../../node_modules/process-nextick-args": { "version": "2.0.1", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/progress": { "version": "2.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.4.0" } @@ -9897,30 +7049,12 @@ "version": "1.2.4", "license": "ISC" }, - "../../../node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "../../../node_modules/proxy-agent": { "version": "6.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -9939,6 +7073,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -9950,6 +7086,8 @@ "version": "7.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -9962,6 +7100,8 @@ "version": "7.0.4", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -9974,6 +7114,8 @@ "version": "7.18.3", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">=12" } @@ -9981,7 +7123,9 @@ "../../../node_modules/proxy-from-env": { "version": "1.1.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/psl": { "version": "1.9.0", @@ -9991,6 +7135,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -10007,6 +7153,8 @@ "version": "20.9.0", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@puppeteer/browsers": "1.4.6", "chromium-bidi": "0.4.16", @@ -10030,12 +7178,16 @@ "../../../node_modules/puppeteer-core/node_modules/devtools-protocol": { "version": "0.0.1147663", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/puppeteer-core/node_modules/ws": { "version": "8.13.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -10062,14 +7214,14 @@ "../../../node_modules/query-selector-shadow-dom": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/querystringify": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/queue-microtask": { "version": "1.2.3", @@ -10093,12 +7245,16 @@ "../../../node_modules/queue-tick": { "version": "1.0.1", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/quick-lru": { "version": "5.1.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -10106,64 +7262,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/quote-stream": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" - }, - "bin": { - "quote-stream": "bin/cmd.js" - } - }, - "../../../node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, "../../../node_modules/randombytes": { "version": "2.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "^5.1.0" } }, - "../../../node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "../../../node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/react-is": { "version": "18.2.0", "dev": true, @@ -10171,7 +7279,10 @@ }, "../../../node_modules/readable-stream": { "version": "2.3.8", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -10184,16 +7295,24 @@ }, "../../../node_modules/readable-stream/node_modules/isarray": { "version": "1.0.0", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/readdir-glob": { "version": "1.1.3", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "minimatch": "^5.1.0" } @@ -10202,6 +7321,8 @@ "version": "5.1.6", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10209,28 +7330,6 @@ "node": ">=10" } }, - "../../../node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "../../../node_modules/rechoir": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, "../../../node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, @@ -10247,26 +7346,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "../../../node_modules/renderkid": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, "../../../node_modules/request": { "version": "2.88.2", "license": "Apache-2.0", @@ -10366,14 +7445,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/require-from-string": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "../../../node_modules/requires-port": { "version": "1.0.0", "dev": true, @@ -10381,6 +7452,7 @@ }, "../../../node_modules/resolve": { "version": "1.22.8", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -10397,26 +7469,9 @@ "../../../node_modules/resolve-alpn": { "version": "1.2.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "peer": true }, "../../../node_modules/resolve-from": { "version": "4.0.0", @@ -10438,6 +7493,8 @@ "version": "3.0.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "lowercase-keys": "^3.0.0" }, @@ -10452,6 +7509,8 @@ "version": "1.11.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-deep-equal": "^2.0.1" } @@ -10459,35 +7518,9 @@ "../../../node_modules/resq/node_modules/fast-deep-equal": { "version": "2.0.1", "dev": true, - "license": "MIT" - }, - "../../../node_modules/restore-cursor": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "../../../node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/retry": { - "version": "0.13.1", - "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" - } + "optional": true, + "peer": true }, "../../../node_modules/reusify": { "version": "1.0.4", @@ -10501,7 +7534,9 @@ "../../../node_modules/rgb2hex": { "version": "0.2.5", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/rimraf": { "version": "3.0.2", @@ -10591,17 +7626,6 @@ "fsevents": "~2.3.2" } }, - "../../../node_modules/run-applescript": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/run-parallel": { "version": "1.2.0", "dev": true, @@ -10627,7 +7651,9 @@ "../../../node_modules/safaridriver": { "version": "0.1.2", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/safe-array-concat": { "version": "1.1.0", @@ -10692,8 +7718,6 @@ "version": "5.0.1", "dev": true, "license": "ISC", - "optional": true, - "peer": true, "dependencies": { "xmlchars": "^2.2.0" }, @@ -10705,6 +7729,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -10718,23 +7744,6 @@ "url": "https://opencollective.com/webpack" } }, - "../../../node_modules/select-hose": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/selfsigned": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, "../../../node_modules/semver": { "version": "7.5.4", "license": "ISC", @@ -10758,51 +7767,12 @@ "node": ">=10" } }, - "../../../node_modules/send": { - "version": "0.18.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, "../../../node_modules/serialize-error": { "version": "11.0.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "type-fest": "^2.12.2" }, @@ -10817,94 +7787,12 @@ "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "../../../node_modules/serve-index": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "../../../node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "../../../node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "../../../node_modules/serve-static": { - "version": "1.15.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "../../../node_modules/set-function-length": { "version": "1.2.0", "dev": true, @@ -10936,12 +7824,9 @@ "../../../node_modules/setimmediate": { "version": "1.0.5", "dev": true, - "license": "MIT" - }, - "../../../node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/shallow-clone": { "version": "3.0.1", @@ -10962,10 +7847,6 @@ "node": ">=0.10.0" } }, - "../../../node_modules/shallow-copy": { - "version": "0.0.1", - "license": "MIT" - }, "../../../node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", @@ -10983,14 +7864,6 @@ "node": ">=8" } }, - "../../../node_modules/shell-quote": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "../../../node_modules/side-channel": { "version": "1.0.4", "dev": true, @@ -11019,11 +7892,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "../../../node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/sirv": { "version": "2.0.4", "dev": true, @@ -11037,64 +7905,26 @@ "node": ">= 10" } }, - "../../../node_modules/slash": { - "version": "3.0.0", + "../../../node_modules/smart-buffer": { + "version": "4.2.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "../../../node_modules/slice-ansi": { - "version": "4.0.0", + "../../../node_modules/socks": { + "version": "2.7.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "../../../node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "../../../node_modules/sockjs": { - "version": "0.3.24", - "dev": true, - "license": "MIT", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "../../../node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "../../../node_modules/socks": { - "version": "2.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { "node": ">= 10.0.0", @@ -11105,6 +7935,8 @@ "version": "8.0.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -11118,6 +7950,8 @@ "version": "7.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -11125,15 +7959,10 @@ "node": ">= 14" } }, - "../../../node_modules/source-list-map": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, "../../../node_modules/source-map": { "version": "0.6.1", - "devOptional": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -11151,56 +7980,19 @@ "version": "0.5.21", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "../../../node_modules/spdy": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "../../../node_modules/spdy-transport": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "../../../node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/split2": { "version": "4.2.0", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "engines": { "node": ">= 10.x" } @@ -11208,7 +8000,9 @@ "../../../node_modules/sprintf-js": { "version": "1.1.3", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "../../../node_modules/sshpk": { "version": "1.18.0", @@ -11238,159 +8032,11 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/static-eval": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "../../../node_modules/static-module": { - "version": "2.2.5", - "license": "MIT", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "../../../node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "../../../node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "../../../node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "../../../node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "license": "MIT", - "dependencies": { - "vlq": "^0.2.2" - } - }, - "../../../node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "license": "MIT" - }, - "../../../node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "../../../node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "../../../node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/std-env": { "version": "3.7.0", "dev": true, "license": "MIT" }, - "../../../node_modules/stdin-discarder": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/stealthy-require": { "version": "1.1.1", "license": "ISC", @@ -11402,6 +8048,8 @@ "version": "2.15.6", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -11409,14 +8057,20 @@ }, "../../../node_modules/string_decoder": { "version": "1.1.1", + "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } }, "../../../node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "dev": true, + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/string-width": { "version": "5.1.2", @@ -11582,21 +8236,6 @@ "dev": true, "license": "MIT" }, - "../../../node_modules/style-loader": { - "version": "3.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, "../../../node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -11608,20 +8247,9 @@ "node": ">=8" } }, - "../../../node_modules/supports-hyperlinks": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, "../../../node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -11630,112 +8258,27 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/svg-inline-loader": { - "version": "0.8.2", + "../../../node_modules/symbol-tree": { + "version": "3.2.4", + "license": "MIT" + }, + "../../../node_modules/tapable": { + "version": "2.2.1", "dev": true, "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" + "engines": { + "node": ">=6" } }, - "../../../node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", + "../../../node_modules/tar-fs": { + "version": "3.0.5", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "../../../node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "../../../node_modules/symbol-tree": { - "version": "3.2.4", - "license": "MIT" - }, - "../../../node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "../../../node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "../../../node_modules/tapable": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "../../../node_modules/tar-fs": { - "version": "3.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "pump": "^3.0.0", + "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^2.1.1", @@ -11746,31 +8289,20 @@ "version": "3.1.7", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, - "../../../node_modules/terminal-link": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/terser": { "version": "5.29.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -11788,6 +8320,8 @@ "version": "5.3.10", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -11820,7 +8354,9 @@ "../../../node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "../../../node_modules/text-table": { "version": "0.2.0", @@ -11830,38 +8366,9 @@ "../../../node_modules/through": { "version": "2.3.8", "dev": true, - "license": "MIT" - }, - "../../../node_modules/through2": { - "version": "0.6.5", - "license": "MIT", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "../../../node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "license": "MIT" - }, - "../../../node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "../../../node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "license": "MIT" - }, - "../../../node_modules/thunky": { - "version": "1.1.0", - "dev": true, - "license": "MIT" + "optional": true, + "peer": true }, "../../../node_modules/tinybench": { "version": "2.6.0", @@ -11895,14 +8402,6 @@ "node": ">=8.0" } }, - "../../../node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "../../../node_modules/totalist": { "version": "3.0.1", "dev": true, @@ -11915,8 +8414,6 @@ "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", - "optional": true, - "peer": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -11931,8 +8428,6 @@ "version": "2.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "punycode": "^2.1.1" }, @@ -11943,18 +8438,9 @@ "../../../node_modules/traverse": { "version": "0.3.9", "dev": true, - "license": "MIT/X11" - }, - "../../../node_modules/ts-api-utils": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } + "license": "MIT/X11", + "optional": true, + "peer": true }, "../../../node_modules/tsconfig-paths": { "version": "3.15.0", @@ -11981,7 +8467,9 @@ "../../../node_modules/tslib": { "version": "2.6.2", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "../../../node_modules/tsx": { "version": "4.7.1", @@ -12442,6 +8930,8 @@ "version": "2.19.0", "dev": true, "license": "(MIT OR CC0-1.0)", + "optional": true, + "peer": true, "engines": { "node": ">=12.20" }, @@ -12449,18 +8939,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "../../../node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "../../../node_modules/typed-array-buffer": { "version": "1.0.0", "dev": true, @@ -12522,10 +9000,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "../../../node_modules/typedarray": { - "version": "0.0.6", - "license": "MIT" - }, "../../../node_modules/typescript": { "version": "5.3.3", "dev": true, @@ -12561,6 +9035,8 @@ "version": "1.4.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -12584,6 +9060,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12598,24 +9076,16 @@ "version": "0.2.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">= 4.0.0" } }, - "../../../node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/unzipper": { "version": "0.10.14", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "^1.6.17", "binary": "~0.3.0", @@ -12647,6 +9117,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -12669,8 +9141,6 @@ "version": "1.5.10", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -12679,27 +9149,17 @@ "../../../node_modules/userhome": { "version": "1.0.0", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.8.0" } }, "../../../node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" - }, - "../../../node_modules/utila": { - "version": "0.4.0", "dev": true, "license": "MIT" }, - "../../../node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "../../../node_modules/uuid": { "version": "3.4.0", "license": "MIT", @@ -12707,14 +9167,6 @@ "uuid": "bin/uuid" } }, - "../../../node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "../../../node_modules/verror": { "version": "1.10.0", "engines": [ @@ -12933,10 +9385,6 @@ "node": ">=0.4.0" } }, - "../../../node_modules/vlq": { - "version": "0.2.3", - "license": "MIT" - }, "../../../node_modules/w3c-hr-time": { "version": "1.0.2", "license": "MIT", @@ -12948,8 +9396,6 @@ "version": "2.0.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "xml-name-validator": "^3.0.0" }, @@ -12961,6 +9407,8 @@ "version": "1.1.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -12977,6 +9425,8 @@ "version": "2.4.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12985,26 +9435,12 @@ "node": ">=10.13.0" } }, - "../../../node_modules/wbuf": { - "version": "1.7.3", - "dev": true, - "license": "MIT", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "../../../node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, "../../../node_modules/web-streams-polyfill": { "version": "3.3.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 8" } @@ -13013,6 +9449,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", @@ -13034,6 +9472,8 @@ "version": "8.32.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@wdio/config": "8.32.3", @@ -13066,390 +9506,136 @@ "peerDependencies": { "devtools": "^8.14.0" }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "../../../node_modules/webidl-conversions": { - "version": "6.1.0", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=10.4" - } - }, - "../../../node_modules/webpack": { - "version": "5.90.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "../../../node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.9", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli": { - "version": "5.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "../../../node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "../../../node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^4.6.0", - "mime-types": "^2.1.31", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "../../../node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "../../../node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "../../../node_modules/webpack-dev-server": { - "version": "5.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^4.17.21", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^1.15.5", - "@types/sockjs": "^0.3.36", - "@types/ws": "^8.5.10", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.2.1", - "chokidar": "^3.6.0", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.4.0", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.1.0", - "launch-editor": "^2.6.1", - "open": "^10.0.3", - "p-retry": "^6.2.0", - "rimraf": "^5.0.5", - "schema-utils": "^4.2.0", - "selfsigned": "^2.4.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.0.0", - "ws": "^8.16.0" - }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "../../../node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "../../../node_modules/webpack": { + "version": "5.90.3", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" + "webpack": "bin/webpack.js" }, "engines": { - "node": ">= 18.12.0" + "node": ">=10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, - "peerDependencies": { - "webpack": "^5.0.0" - }, "peerDependenciesMeta": { - "webpack": { - "optional": true - }, "webpack-cli": { "optional": true } } }, - "../../../node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", + "../../../node_modules/webpack-bundle-analyzer": { + "version": "4.10.1", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "is-plain-object": "^5.0.0", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" } }, - "../../../node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", + "../../../node_modules/webpack-bundle-analyzer/node_modules/acorn-walk": { + "version": "8.3.2", "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=0.4.0" } }, - "../../../node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", + "../../../node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 10" + } }, - "../../../node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", + "../../../node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { + "version": "5.0.0", "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, + "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.10.0" } }, - "../../../node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", + "../../../node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.9", "dev": true, "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, "engines": { - "node": ">= 12.13.0" + "node": ">=8.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "../../../node_modules/webpack-merge": { @@ -13465,19 +9651,12 @@ "node": ">=10.0.0" } }, - "../../../node_modules/webpack-sources": { - "version": "1.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "../../../node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13490,6 +9669,8 @@ "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -13498,6 +9679,8 @@ "version": "3.3.0", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -13506,31 +9689,12 @@ "version": "3.2.3", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } }, - "../../../node_modules/websocket-driver": { - "version": "0.7.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "../../../node_modules/websocket-extensions": { - "version": "0.1.4", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "../../../node_modules/whatwg-encoding": { "version": "1.0.5", "license": "MIT", @@ -13546,8 +9710,6 @@ "version": "9.1.0", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { "tr46": "^2.1.0", "webidl-conversions": "^6.1.0" @@ -13617,20 +9779,6 @@ "node": ">=8" } }, - "../../../node_modules/widest-line": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "../../../node_modules/wildcard": { "version": "2.0.1", "dev": true, @@ -13755,9 +9903,7 @@ "../../../node_modules/xmlchars": { "version": "2.2.0", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "../../../node_modules/xmldom": { "version": "0.1.31", @@ -13766,13 +9912,6 @@ "node": ">=0.1" } }, - "../../../node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "../../../node_modules/y18n": { "version": "5.0.8", "dev": true, @@ -13785,14 +9924,6 @@ "version": "4.0.0", "license": "ISC" }, - "../../../node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "../../../node_modules/yargs": { "version": "17.7.2", "dev": true, @@ -13860,6 +9991,8 @@ "version": "5.0.1", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^4.0.1", "compress-commons": "^5.0.1", @@ -13873,6 +10006,8 @@ "version": "3.6.2", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16597,17 +12732,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -16633,19 +12757,6 @@ "node": ">=6.11.5" } }, - "node_modules/loader-utils": { - "version": "1.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/locate-path": { "version": "5.0.0", "dev": true, @@ -16792,14 +12903,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.0.4", "dev": true, @@ -16911,14 +13014,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -17745,11 +13840,6 @@ "dev": true, "license": "ISC" }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/sockjs": { "version": "0.3.24", "dev": true, @@ -18008,16 +14098,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/examples/webpack/webpack-project-source/package.json b/examples/webpack/webpack-project-source/package.json index 3be4ac1393..910d2524ea 100644 --- a/examples/webpack/webpack-project-source/package.json +++ b/examples/webpack/webpack-project-source/package.json @@ -19,7 +19,6 @@ "devDependencies": { "css-loader": "^7.1.2", "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", "esbuild-loader": "^4.2.2", "html-webpack-plugin": "^5.6.0", "webpack": "^5.93.0", diff --git a/examples/webpack/webpack-project-source/pnpm-lock.yaml b/examples/webpack/webpack-project-source/pnpm-lock.yaml new file mode 100644 index 0000000000..0bf495bae3 --- /dev/null +++ b/examples/webpack/webpack-project-source/pnpm-lock.yaml @@ -0,0 +1,4245 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + neuroglancer: + specifier: file:../../.. + version: file:../../.. + devDependencies: + css-loader: + specifier: ^7.1.2 + version: 7.1.2(webpack@5.97.1) + esbuild-loader: + specifier: ^4.2.2 + version: 4.2.2(webpack@5.97.1) + html-webpack-plugin: + specifier: ^5.6.0 + version: 5.6.3(webpack@5.97.1) + style-loader: + specifier: ^4.0.0 + version: 4.0.0(webpack@5.97.1) + webpack: + specifier: ^5.93.0 + version: 5.97.1(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + webpack-dev-server: + specifier: ^5.0.4 + version: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + +packages: + + '@discoveryjs/json-ext@0.5.7': + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@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/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jsonjoy.com/base64@1.1.2': + resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/json-pack@1.1.1': + resolution: {integrity: sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/util@1.5.0': + resolution: {integrity: sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@leichtgewicht/ip-codec@2.0.5': + resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/bonjour@3.5.13': + resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + + '@types/connect-history-api-fallback@1.5.4': + resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.19.6': + resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} + + '@types/express-serve-static-core@5.0.6': + resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/html-minifier-terser@6.1.0': + resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/http-proxy@1.17.15': + resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/node-forge@1.3.11': + resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + + '@types/node@22.13.1': + resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-index@1.9.4': + resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/sockjs@0.3.36': + resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + + '@types/ws@8.5.14': + resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + abab@1.0.4: + resolution: {integrity: sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@4.3.4: + resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} + + acorn-walk@6.2.0: + resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} + engines: {node: '>=0.4.0'} + + acorn@5.7.4: + resolution: {integrity: sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@6.4.2: + resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-html-community@0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.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'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + array-equal@1.0.2: + resolution: {integrity: sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + + assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + + async-limiter@1.0.1: + resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + batch@0.6.1: + resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} + + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + + big.js@5.2.2: + resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + bonjour-service@1.3.0: + resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + caniuse-lite@1.0.30001697: + resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + codemirror@5.65.18: + resolution: {integrity: sha512-Gaz4gHnkbHMGgahNt3CA5HBk5lLQBqmD/pBgeB4kQU6OedZmqMBjlRF0LSrp2tJ4wlLNPm2FfaUd1pDy0mdlpA==} + + 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==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} + engines: {node: '>= 0.8.0'} + + condense-newlines@0.2.1: + resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} + engines: {node: '>=0.10.0'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + connect-history-api-fallback@2.0.0: + resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} + engines: {node: '>=0.8'} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie@0.7.1: + resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==} + engines: {node: '>= 0.6'} + + core-js@3.40.0: + resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} + + core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-loader@7.1.2: + resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.27.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssstyle@0.2.37: + resolution: {integrity: sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==} + + dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + + data-urls@1.1.0: + resolution: {integrity: sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + 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-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + + dns-packet@5.6.1: + resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + engines: {node: '>=6'} + + dom-converter@0.2.0: + resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domexception@1.0.1: + resolution: {integrity: sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==} + deprecated: Use your platform's native DOMException instead + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.5.91: + resolution: {integrity: sha512-sNSHHyq048PFmZY4S90ax61q+gLCs0X0YmcOII9wG9S2XwbVr+h4VW2wWhnbp/Eys3cCwTxVF292W3qPaxIapQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + emojis-list@3.0.0: + resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} + engines: {node: '>= 4'} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.1: + resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} + engines: {node: '>=10.13.0'} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + esbuild-loader@4.2.2: + resolution: {integrity: sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==} + peerDependencies: + webpack: ^4.40.0 || ^5.0.0 + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escodegen@1.14.3: + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} + hasBin: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} + engines: {node: '>= 0.10.0'} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + faye-websocket@0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + finalhandler@1.3.1: + resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + + form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + + getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + + gl-matrix@3.1.0: + resolution: {integrity: sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + handle-thing@2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + + har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + + har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hpack.js@2.1.6: + resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + + html-encoding-sniffer@1.0.2: + resolution: {integrity: sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==} + + html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} + engines: {node: '>=10.13.0'} + peerDependencies: + '@rspack/core': 0.x || 1.x + webpack: ^5.20.0 + peerDependenciesMeta: + '@rspack/core': + optional: true + webpack: + optional: true + + htmlparser2@6.1.0: + resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} + + http-deceiver@1.2.7: + resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + + http-errors@1.6.3: + resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + engines: {node: '>= 0.6'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-parser-js@0.5.9: + resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==} + + http-proxy-middleware@2.0.7: + resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/express': ^4.17.13 + peerDependenciesMeta: + '@types/express': + optional: true + + http-proxy@1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + + http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + + hyperdyperid@1.2.0: + resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} + engines: {node: '>=10.18'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + resolution: {tarball: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89} + version: 1.1.1 + + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} + hasBin: true + + inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + ipaddr.js@2.2.0: + resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} + engines: {node: '>= 10'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-network-error@1.1.0: + resolution: {integrity: sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==} + engines: {node: '>=16'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-whitespace@0.3.0: + resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + + jsdom@11.10.0: + resolution: {integrity: sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + launch-editor@2.9.1: + resolution: {integrity: sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==} + + left-pad@1.3.0: + resolution: {integrity: sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==} + deprecated: use String.prototype.padStart() + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + loader-utils@2.0.4: + resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} + engines: {node: '>=8.9.0'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memfs@4.17.0: + resolution: {integrity: sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==} + engines: {node: '>= 4.0.0'} + + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-db@1.53.0: + resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + multicast-dns@7.2.5: + resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + neuroglancer@file:../../..: + resolution: {directory: ../../.., type: directory} + engines: {node: '>=22'} + + nifti-reader-js@0.6.8: + resolution: {integrity: sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==} + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-forge@1.3.1: + resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} + engines: {node: '>= 6.13.0'} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + numcodecs@0.3.2: + resolution: {integrity: sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==} + + nwmatcher@1.4.4: + resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} + + oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parse5@4.0.0: + resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pn@1.1.0: + resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-selector-parser@7.0.0: + resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + pretty-error@4.0.0: + resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} + + pretty@2.0.0: + resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} + engines: {node: '>=0.10.0'} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + + renderkid@3.0.0: + resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} + + request-promise-core@1.1.4: + resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==} + engines: {node: '>=0.10.0'} + peerDependencies: + request: ^2.34 + + request-promise-native@1.0.9: + resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==} + engines: {node: '>=0.12.0'} + deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142 + peerDependencies: + request: ^2.34 + + request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + select-hose@2.0.0: + resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + + selfsigned@2.4.1: + resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + engines: {node: '>=10'} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + engines: {node: '>= 0.8.0'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-index@1.9.1: + resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + engines: {node: '>= 0.8.0'} + + serve-static@1.16.2: + resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + engines: {node: '>= 0.8.0'} + + setprototypeof@1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + 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'} + + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sockjs@0.3.24: + resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} + + source-list-map@2.0.1: + resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdy-transport@3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + + spdy@4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + + sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stealthy-require@1.1.1: + resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} + engines: {node: '>=0.10.0'} + + 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'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + 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'} + + style-loader@4.0.0: + resolution: {integrity: sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.27.0 + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + thingies@1.21.0: + resolution: {integrity: sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==} + engines: {node: '>=10.18'} + peerDependencies: + tslib: ^2 + + thunky@1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-dump@1.0.2: + resolution: {integrity: sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.2: + resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utila@0.4.0: + resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + + w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wbuf@1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-dev-middleware@7.4.2: + resolution: {integrity: sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==} + engines: {node: '>= 18.12.0'} + peerDependencies: + webpack: ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + + webpack-dev-server@5.2.0: + resolution: {integrity: sha512-90SqqYXA2SK36KcT6o1bvwvZfJFcmoamqeJY7+boioffX9g9C0wjjJRGUrQIuh43pb0ttX7+ssavmj/WN2RHtA==} + engines: {node: '>= 18.12.0'} + hasBin: true + peerDependencies: + webpack: ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + + webpack-sources@1.4.3: + resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + websocket-driver@0.7.4: + resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} + engines: {node: '>=0.8.0'} + + websocket-extensions@0.1.4: + resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} + engines: {node: '>=0.8.0'} + + whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + + whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + + whatwg-url@6.5.0: + resolution: {integrity: sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + 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'} + + ws@4.1.0: + resolution: {integrity: sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + + xmldom@0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + +snapshots: + + '@discoveryjs/json-ext@0.5.7': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + 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 + + '@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/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@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 + + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/json-pack@1.1.1(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@leichtgewicht/ip-codec@2.0.5': {} + + '@one-ini/wasm@0.1.1': {} + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 22.13.1 + + '@types/bonjour@3.5.13': + dependencies: + '@types/node': 22.13.1 + + '@types/connect-history-api-fallback@1.5.4': + dependencies: + '@types/express-serve-static-core': 5.0.6 + '@types/node': 22.13.1 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 22.13.1 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.6': {} + + '@types/express-serve-static-core@4.19.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express-serve-static-core@5.0.6': + dependencies: + '@types/node': 22.13.1 + '@types/qs': 6.9.18 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.6 + '@types/qs': 6.9.18 + '@types/serve-static': 1.15.7 + + '@types/html-minifier-terser@6.1.0': {} + + '@types/http-errors@2.0.4': {} + + '@types/http-proxy@1.17.15': + dependencies: + '@types/node': 22.13.1 + + '@types/json-schema@7.0.15': {} + + '@types/mime@1.3.5': {} + + '@types/node-forge@1.3.11': + dependencies: + '@types/node': 22.13.1 + + '@types/node@22.13.1': + dependencies: + undici-types: 6.20.0 + + '@types/qs@6.9.18': {} + + '@types/range-parser@1.2.7': {} + + '@types/retry@0.12.2': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 22.13.1 + + '@types/serve-index@1.9.4': + dependencies: + '@types/express': 4.17.21 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 22.13.1 + '@types/send': 0.17.4 + + '@types/sockjs@0.3.36': + dependencies: + '@types/node': 22.13.1 + + '@types/ws@8.5.14': + dependencies: + '@types/node': 22.13.1 + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.0)(webpack@5.97.1)': + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + optionalDependencies: + webpack-dev-server: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + abab@1.0.4: {} + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@4.3.4: + dependencies: + acorn: 6.4.2 + acorn-walk: 6.2.0 + + acorn-walk@6.2.0: {} + + acorn@5.7.4: {} + + acorn@6.4.2: {} + + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-html-community@0.0.8: {} + + 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: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + array-equal@1.0.2: {} + + array-flatten@1.1.1: {} + + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + + assert-plus@1.0.0: {} + + async-limiter@1.0.1: {} + + asynckit@0.4.0: {} + + aws-sign2@0.7.0: {} + + aws4@1.13.2: {} + + balanced-match@1.0.2: {} + + batch@0.6.1: {} + + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + + big.js@5.2.2: {} + + binary-extensions@2.3.0: {} + + body-parser@1.20.3: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + bonjour-service@1.3.0: + dependencies: + fast-deep-equal: 3.1.3 + multicast-dns: 7.2.5 + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-process-hrtime@1.0.0: {} + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001697 + electron-to-chromium: 1.5.91 + node-releases: 2.0.19 + update-browserslist-db: 1.1.2(browserslist@4.24.4) + + buffer-from@1.1.2: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + bytes@3.1.2: {} + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.8.1 + + caniuse-lite@1.0.30001697: {} + + caseless@0.12.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chrome-trace-event@1.0.4: {} + + clean-css@5.3.3: + dependencies: + source-map: 0.6.1 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + codemirror@5.65.18: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@2.20.3: {} + + commander@8.3.0: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.53.0 + + compression@1.7.5: + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + debug: 2.6.9 + negotiator: 0.6.4 + on-headers: 1.0.2 + safe-buffer: 5.2.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + condense-newlines@0.2.1: + dependencies: + extend-shallow: 2.0.1 + is-whitespace: 0.3.0 + kind-of: 3.2.2 + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + connect-history-api-fallback@2.0.0: {} + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + cookie-signature@1.0.6: {} + + cookie@0.7.1: {} + + core-js@3.40.0: {} + + core-util-is@1.0.2: {} + + core-util-is@1.0.3: {} + + crc-32@1.2.2: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-loader@7.1.2(webpack@5.97.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.1) + postcss-modules-scope: 3.2.1(postcss@8.5.1) + postcss-modules-values: 4.0.0(postcss@8.5.1) + postcss-value-parser: 4.2.0 + semver: 7.7.1 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssom@0.3.8: {} + + cssstyle@0.2.37: + dependencies: + cssom: 0.3.8 + + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 + + data-urls@1.1.0: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 7.1.0 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-lazy-prop@3.0.0: {} + + delayed-stream@1.0.0: {} + + depd@1.1.2: {} + + depd@2.0.0: {} + + destroy@1.2.0: {} + + detect-node@2.1.0: {} + + dns-packet@5.6.1: + dependencies: + '@leichtgewicht/ip-codec': 2.0.5 + + dom-converter@0.2.0: + dependencies: + utila: 0.4.0 + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domexception@1.0.1: + dependencies: + webidl-conversions: 4.0.2 + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + ecc-jsbn@0.1.2: + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.1 + + ee-first@1.1.1: {} + + electron-to-chromium@1.5.91: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + emojis-list@3.0.0: {} + + encodeurl@1.0.2: {} + + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + entities@2.2.0: {} + + envinfo@7.14.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild-loader@4.2.2(webpack@5.97.1): + dependencies: + esbuild: 0.21.5 + get-tsconfig: 4.10.0 + loader-utils: 2.0.4 + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-sources: 1.4.3 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escodegen@1.14.3: + dependencies: + esprima: 4.0.1 + estraverse: 4.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + esprima@4.0.1: {} + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventemitter3@4.0.7: {} + + events@3.3.0: {} + + express@4.21.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.3 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.7.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.3.1 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.12 + proxy-addr: 2.0.7 + qs: 6.13.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.2 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + extsprintf@1.3.0: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastest-levenshtein@1.0.16: {} + + faye-websocket@0.11.4: + dependencies: + websocket-driver: 0.7.4 + + fflate@0.8.2: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.3.1: + dependencies: + debug: 2.6.9 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + follow-redirects@1.15.9: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + forever-agent@0.6.1: {} + + form-data@2.3.3: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fresh@0.5.2: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-tsconfig@4.10.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + getpass@0.1.7: + dependencies: + assert-plus: 1.0.0 + + gl-matrix@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + handle-thing@2.0.1: {} + + har-schema@2.0.0: {} + + har-validator@5.1.5: + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hpack.js@2.1.6: + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.8 + wbuf: 1.7.3 + + html-encoding-sniffer@1.0.2: + dependencies: + whatwg-encoding: 1.0.5 + + html-minifier-terser@6.1.0: + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.37.0 + + html-webpack-plugin@5.6.3(webpack@5.97.1): + dependencies: + '@types/html-minifier-terser': 6.1.0 + html-minifier-terser: 6.1.0 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + htmlparser2@6.1.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 2.2.0 + + http-deceiver@1.2.7: {} + + http-errors@1.6.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-parser-js@0.5.9: {} + + http-proxy-middleware@2.0.7(@types/express@4.17.21): + dependencies: + '@types/http-proxy': 1.17.15 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.8 + optionalDependencies: + '@types/express': 4.17.21 + transitivePeerDependencies: + - debug + + http-proxy@1.18.1: + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.15.9 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + + http-signature@1.2.0: + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + + hyperdyperid@1.2.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + + ikonate@https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89: + dependencies: + jsdom: 11.10.0 + pretty: 2.0.0 + xmldom: 0.1.31 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + inherits@2.0.3: {} + + inherits@2.0.4: {} + + ini@1.3.8: {} + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + ipaddr.js@2.2.0: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@1.1.6: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-network-error@1.1.0: {} + + is-number@7.0.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-typedarray@1.0.0: {} + + is-whitespace@0.3.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + isstream@0.1.2: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-worker@27.5.1: + dependencies: + '@types/node': 22.13.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-beautify@1.15.1: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + jsbn@0.1.1: {} + + jsdom@11.10.0: + dependencies: + abab: 1.0.4 + acorn: 5.7.4 + acorn-globals: 4.3.4 + array-equal: 1.0.2 + cssom: 0.3.8 + cssstyle: 0.2.37 + data-urls: 1.1.0 + domexception: 1.0.1 + escodegen: 1.14.3 + html-encoding-sniffer: 1.0.2 + left-pad: 1.3.0 + nwmatcher: 1.4.4 + parse5: 4.0.0 + pn: 1.1.0 + request: 2.88.2 + request-promise-native: 1.0.9(request@2.88.2) + sax: 1.4.1 + symbol-tree: 3.2.4 + tough-cookie: 2.5.0 + w3c-hr-time: 1.0.2 + webidl-conversions: 4.0.2 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 6.5.0 + ws: 4.1.0 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-schema@0.4.0: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsprim@1.4.2: + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@6.0.3: {} + + launch-editor@2.9.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.8.2 + + left-pad@1.3.0: {} + + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + + loader-runner@4.3.0: {} + + loader-utils@2.0.4: + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.3 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash-es@4.17.21: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + math-intrinsics@1.1.0: {} + + media-typer@0.3.0: {} + + memfs@4.17.0: + dependencies: + '@jsonjoy.com/json-pack': 1.1.1(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 + + merge-descriptors@1.0.3: {} + + merge-stream@2.0.0: {} + + methods@1.1.2: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-db@1.53.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + minimalistic-assert@1.0.1: {} + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.2: {} + + ms@2.0.0: {} + + ms@2.1.3: {} + + multicast-dns@7.2.5: + dependencies: + dns-packet: 5.6.1 + thunky: 1.1.0 + + nanoid@3.3.8: {} + + negotiator@0.6.3: {} + + negotiator@0.6.4: {} + + neo-async@2.6.2: {} + + neuroglancer@file:../../..: + dependencies: + codemirror: 5.65.18 + core-js: 3.40.0 + crc-32: 1.2.2 + gl-matrix: 3.1.0 + ikonate: https://codeload.github.com/mikolajdobrucki/ikonate/tar.gz/a86b4107c6ec717e7877f880a930d1ccf0b59d89 + lodash-es: 4.17.21 + nifti-reader-js: 0.6.8 + numcodecs: 0.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + nifti-reader-js@0.6.8: + dependencies: + fflate: 0.8.2 + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.1 + + node-forge@1.3.1: {} + + node-releases@2.0.19: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + numcodecs@0.3.2: + dependencies: + fflate: 0.8.2 + + nwmatcher@1.4.4: {} + + oauth-sign@0.9.0: {} + + object-inspect@1.13.3: {} + + obuf@1.1.2: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.1.0 + retry: 0.13.1 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + parse5@4.0.0: {} + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.8.1 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-to-regexp@0.1.12: {} + + performance-now@2.1.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pn@1.1.0: {} + + postcss-modules-extract-imports@3.1.0(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + postcss-selector-parser: 7.0.0 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.1): + dependencies: + postcss: 8.5.1 + postcss-selector-parser: 7.0.0 + + postcss-modules-values@4.0.0(postcss@8.5.1): + dependencies: + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 + + postcss-selector-parser@7.0.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.1.2: {} + + pretty-error@4.0.0: + dependencies: + lodash: 4.17.21 + renderkid: 3.0.0 + + pretty@2.0.0: + dependencies: + condense-newlines: 0.2.1 + extend-shallow: 2.0.1 + js-beautify: 1.15.1 + + process-nextick-args@2.0.1: {} + + proto-list@1.2.4: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 + + punycode@2.3.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.1.0 + + qs@6.5.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + + relateurl@0.2.7: {} + + renderkid@3.0.0: + dependencies: + css-select: 4.3.0 + dom-converter: 0.2.0 + htmlparser2: 6.1.0 + lodash: 4.17.21 + strip-ansi: 6.0.1 + + request-promise-core@1.1.4(request@2.88.2): + dependencies: + lodash: 4.17.21 + request: 2.88.2 + + request-promise-native@1.0.9(request@2.88.2): + dependencies: + request: 2.88.2 + request-promise-core: 1.1.4(request@2.88.2) + stealthy-require: 1.1.1 + tough-cookie: 2.5.0 + + request@2.88.2: + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.2 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + + require-from-string@2.0.2: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + retry@0.13.1: {} + + run-applescript@7.0.0: {} + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sax@1.4.1: {} + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + + select-hose@2.0.0: {} + + selfsigned@2.4.1: + dependencies: + '@types/node-forge': 1.3.11 + node-forge: 1.3.1 + + semver@7.7.1: {} + + send@0.19.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-index@1.9.1: + dependencies: + accepts: 1.3.8 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.35 + parseurl: 1.3.3 + transitivePeerDependencies: + - supports-color + + serve-static@1.16.2: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.19.0 + transitivePeerDependencies: + - supports-color + + setprototypeof@1.1.0: {} + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.2: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + sockjs@0.3.24: + dependencies: + faye-websocket: 0.11.4 + uuid: 8.3.2 + websocket-driver: 0.7.4 + + source-list-map@2.0.1: {} + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdy-transport@3.0.0: + dependencies: + debug: 4.4.0 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.2 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + + spdy@4.0.2: + dependencies: + debug: 4.4.0 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + + sshpk@1.18.0: + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + + statuses@1.5.0: {} + + statuses@2.0.1: {} + + stealthy-require@1.1.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 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + style-loader@4.0.0(webpack@5.97.1): + dependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.11(webpack@5.97.1): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.97.1(webpack-cli@5.1.4) + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + thingies@1.21.0(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + thunky@1.1.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + tough-cookie@2.5.0: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-dump@1.0.2(tslib@2.8.1): + dependencies: + tslib: 2.8.1 + + tslib@2.8.1: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + tweetnacl@0.14.5: {} + + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + undici-types@6.20.0: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.2(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utila@0.4.0: {} + + utils-merge@1.0.1: {} + + uuid@3.4.0: {} + + uuid@8.3.2: {} + + vary@1.1.2: {} + + verror@1.10.0: + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + + w3c-hr-time@1.0.2: + dependencies: + browser-process-hrtime: 1.0.0 + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + wbuf@1.7.3: + dependencies: + minimalistic-assert: 1.0.1 + + webidl-conversions@4.0.2: {} + + webpack-cli@5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.97.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.97.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.0)(webpack@5.97.1) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + optionalDependencies: + webpack-dev-server: 5.2.0(webpack-cli@5.1.4)(webpack@5.97.1) + + webpack-dev-middleware@7.4.2(webpack@5.97.1): + dependencies: + colorette: 2.0.20 + memfs: 4.17.0 + mime-types: 2.1.35 + on-finished: 2.4.1 + range-parser: 1.2.1 + schema-utils: 4.3.0 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + + webpack-dev-server@5.2.0(webpack-cli@5.1.4)(webpack@5.97.1): + dependencies: + '@types/bonjour': 3.5.13 + '@types/connect-history-api-fallback': 1.5.4 + '@types/express': 4.17.21 + '@types/serve-index': 1.9.4 + '@types/serve-static': 1.15.7 + '@types/sockjs': 0.3.36 + '@types/ws': 8.5.14 + ansi-html-community: 0.0.8 + bonjour-service: 1.3.0 + chokidar: 3.6.0 + colorette: 2.0.20 + compression: 1.7.5 + connect-history-api-fallback: 2.0.0 + express: 4.21.2 + graceful-fs: 4.2.11 + http-proxy-middleware: 2.0.7(@types/express@4.17.21) + ipaddr.js: 2.2.0 + launch-editor: 2.9.1 + open: 10.1.0 + p-retry: 6.2.1 + schema-utils: 4.3.0 + selfsigned: 2.4.1 + serve-index: 1.9.1 + sockjs: 0.3.24 + spdy: 4.0.2 + webpack-dev-middleware: 7.4.2(webpack@5.97.1) + ws: 8.18.0 + optionalDependencies: + webpack: 5.97.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + + webpack-sources@1.4.3: + dependencies: + source-list-map: 2.0.1 + source-map: 0.6.1 + + webpack-sources@3.2.3: {} + + webpack@5.97.1(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.1 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(webpack@5.97.1) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack-dev-server@5.2.0)(webpack@5.97.1) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + websocket-driver@0.7.4: + dependencies: + http-parser-js: 0.5.9 + safe-buffer: 5.2.1 + websocket-extensions: 0.1.4 + + websocket-extensions@0.1.4: {} + + whatwg-encoding@1.0.5: + dependencies: + iconv-lite: 0.4.24 + + whatwg-mimetype@2.3.0: {} + + whatwg-url@6.5.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wildcard@2.0.1: {} + + word-wrap@1.2.5: {} + + 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 + + ws@4.1.0: + dependencies: + async-limiter: 1.0.1 + safe-buffer: 5.1.2 + + ws@8.18.0: {} + + xml-name-validator@3.0.0: {} + + xmldom@0.1.31: {} diff --git a/ngauth_server/.gitignore b/ngauth_server/.gitignore index 6ea7ac4955..56c6e9f6d7 100644 --- a/ngauth_server/.gitignore +++ b/ngauth_server/.gitignore @@ -1,2 +1,3 @@ .envrc /secrets +/ngauth diff --git a/ngauth_server/go.mod b/ngauth_server/go.mod index 600017f987..a9b29cac17 100644 --- a/ngauth_server/go.mod +++ b/ngauth_server/go.mod @@ -22,9 +22,9 @@ require ( github.com/google/go-cmp v0.5.9 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/sys v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.33.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/grpc v1.56.3 // indirect ) diff --git a/ngauth_server/go.sum b/ngauth_server/go.sum index 54f4b5e72d..dc233604da 100644 --- a/ngauth_server/go.sum +++ b/ngauth_server/go.sum @@ -79,8 +79,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= @@ -91,13 +91,13 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/package-lock.json b/package-lock.json index bb11614bf3..2285d50111 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,51 +10,65 @@ "license": "Apache-2.0", "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", + "msgpackr": "^1.11.2", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.2" + "numcodecs": "^0.3.2", + "valibot": "^1.0.0-beta.15" }, "devDependencies": { + "@eslint/js": "^9.19.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.50.1", + "@playwright/test": "^1.50.1", + "@rspack/cli": "^1.2.2", + "@rspack/core": "^1.2.2", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.13.1", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.5", + "@vitest/ui": "^3.0.5", + "@vitest/web-worker": "^3.0.5", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", + "esbuild": "^0.24.2", + "eslint": "^9.19.0", "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.9", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "fzstd": "^0.1.1", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.9", + "playwright": "^1.50.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0", + "vitest": "^3.0.5", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -66,46 +80,61 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "node_modules/@asamuzakjp/css-color": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-2.8.3.tgz", + "integrity": "sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "@csstools/css-calc": "^2.1.1", + "@csstools/css-color-parser": "^3.0.7", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" } }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -116,6 +145,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -128,6 +158,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -142,6 +173,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -150,13 +182,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -166,6 +200,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -175,6 +210,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -183,10 +219,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz", - "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", "dev": true, + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -195,19 +232,20 @@ } }, "node_modules/@bundled-es-modules/cookie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz", - "integrity": "sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", "dev": true, "dependencies": { - "cookie": "^0.5.0" + "cookie": "^0.7.2" } }, "node_modules/@bundled-es-modules/cookie/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -231,6 +269,121 @@ "tough-cookie": "^4.1.4" } }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.1.tgz", + "integrity": "sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.7.tgz", + "integrity": "sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -241,13 +394,14 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" @@ -257,13 +411,14 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -273,13 +428,14 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -289,13 +445,14 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" @@ -305,13 +462,14 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -321,13 +479,14 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -337,13 +496,14 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -353,13 +513,14 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -369,13 +530,14 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -385,13 +547,14 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -401,13 +564,14 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -417,13 +581,14 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -433,13 +598,14 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -449,13 +615,14 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -465,13 +632,14 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -481,13 +649,14 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -497,13 +666,14 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -512,14 +682,32 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -529,13 +717,14 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -545,13 +734,14 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -561,13 +751,14 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" @@ -577,13 +768,14 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -593,13 +785,14 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -609,13 +802,14 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -640,24 +834,73 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", + "espree": "^10.0.1", + "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -665,7 +908,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -694,48 +937,71 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.19.0.tgz", + "integrity": "sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" }, "engines": { - "node": ">=10.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { @@ -751,40 +1017,46 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@inquirer/confirm": { - "version": "3.1.17", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.17.tgz", - "integrity": "sha512-qCpt/AABzPynz8tr69VDvhcjwmzAryipWXtW8Vi6m651da4H/d0Bdn55LkxXD7Rp2gfgxvxzTdb66AhIA8gzBA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.0.tgz", + "integrity": "sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw==", "dev": true, "dependencies": { - "@inquirer/core": "^9.0.5", - "@inquirer/type": "^1.5.1" + "@inquirer/core": "^10.1.1", + "@inquirer/type": "^3.0.1" }, "engines": { "node": ">=18" - } + }, + "peerDependencies": { + "@types/node": ">=18" + } }, "node_modules/@inquirer/core": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.0.5.tgz", - "integrity": "sha512-QWG41I7vn62O9stYKg/juKXt1PEbr/4ZZCPb4KgXDQGwgA9M5NBTQ7FnOvT1ridbxkm/wTxLCNraUs7y47pIRQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.1.tgz", + "integrity": "sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA==", "dev": true, "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.1", - "@types/mute-stream": "^0.0.4", - "@types/node": "^20.14.11", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.8", + "@inquirer/type": "^3.0.1", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", @@ -794,21 +1066,6 @@ "node": ">=18" } }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@inquirer/core/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -829,18 +1086,6 @@ "node": ">=8" } }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@inquirer/core/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -856,26 +1101,94 @@ } }, "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz", + "integrity": "sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/@inquirer/type": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.1.tgz", - "integrity": "sha512-m3YgGQlKNS0BM+8AFiJkCsTqHEFCWn6s/Rqye3mYwvqY6LdfUv12eSwbsgNzrYyrLXiy7IrrjDLPysaSBwEfhw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz", + "integrity": "sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + } + }, + "node_modules/@iodigital/vite-plugin-msw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iodigital/vite-plugin-msw/-/vite-plugin-msw-2.0.0.tgz", + "integrity": "sha512-b4041DewCVSGKQHu5BocPzMSW94/8h59AV6n6umEXHoeqf4nX77ve+gPb/+lmMuPXOtPL1d8465CKyx0ek6Fuw==", + "dev": true, + "dependencies": { + "@mswjs/interceptors": "^0.25.7", + "body-parser": "^1.20.2", + "fs-extra": "^11.1.1", + "headers-polyfill": "^4.0.2", + "strict-event-emitter": "^0.5.1" + }, + "peerDependencies": { + "msw": "^2.0.0" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/@mswjs/interceptors": { + "version": "0.25.16", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.16.tgz", + "integrity": "sha512-8QC8JyKztvoGAdPgyZy49c9vSHHAZjHagwl4RY9E8carULk8ym3iTaiawrT1YoLF/qb449h48f71XDPgkUSOUg==", "dev": true, "dependencies": { - "mute-stream": "^1.0.0" + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.2.1", + "strict-event-emitter": "^0.5.1" }, "engines": { "node": ">=18" } }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@iodigital/vite-plugin-msw/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -951,6 +1264,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -965,6 +1280,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -974,6 +1291,8 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -983,15 +1302,17 @@ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -999,28 +1320,213 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz", + "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==", + "dev": true, + "dependencies": { + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/util": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz", + "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/error-codes": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz", + "integrity": "sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@module-federation/runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.8.4.tgz", + "integrity": "sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/error-codes": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@module-federation/runtime-tools": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.8.4.tgz", + "integrity": "sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/webpack-bundler-runtime": "0.8.4" + } + }, + "node_modules/@module-federation/sdk": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.8.4.tgz", + "integrity": "sha512-waABomIjg/5m1rPDBWYG4KUhS5r7OUUY7S+avpaVIY/tkPWB3ibRDKy2dNLLAMaLKq0u+B1qIdEp4NIWkqhqpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "isomorphic-rslog": "0.0.6" + } + }, + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.8.4.tgz", + "integrity": "sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime": "0.8.4", + "@module-federation/sdk": "0.8.4" + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@mswjs/interceptors": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.29.1.tgz", - "integrity": "sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw==", + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.3.tgz", + "integrity": "sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==", "dev": true, "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", + "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" }, "engines": { @@ -1062,6 +1568,15 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -1089,51 +1604,197 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@oxlint/darwin-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-arm64/-/darwin-arm64-0.15.9.tgz", + "integrity": "sha512-uN7/cTetK0wL4+EAOf6I5nVnUE0skeXoAJ0wl+5o1Lx/o50GcQhJacEEBm/748hxyy+gTRa53mulfR88IpYibA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.24", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", - "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", - "dev": true + "os": [ + "darwin" + ] }, - "node_modules/@promptbook/utils": { - "version": "0.58.0", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.58.0.tgz", - "integrity": "sha512-TglWndmjikWN+OGg9eNOUaMTM7RHr8uFCtgxfWULT1BUjcohywdijf54vS1U4mZ1tBLdHD4/fIrIHtmHzPUIZQ==", + "node_modules/@oxlint/darwin-x64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/darwin-x64/-/darwin-x64-0.15.9.tgz", + "integrity": "sha512-8X2+2szTo/C0lxhP3yn5CCj6Vr+U4QQcCIM2hShSekPrh151PHrARV9/vywLssx4MhMvz7TqYZK2YQTDGjKwQw==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@oxlint/linux-arm64-gnu": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-gnu/-/linux-arm64-gnu-0.15.9.tgz", + "integrity": "sha512-o6coJobmKJu++KDpU3GoXrBKXKSwGlZHpotHp8H1PIqPsfU+0psv/hhjDhjN7UwDxrULnRIzKj0giDXdAXK55A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-arm64-musl": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/linux-arm64-musl/-/linux-arm64-musl-0.15.9.tgz", + "integrity": "sha512-wI1yvE490/r4GAmiocIsYKEY++SGzbcO7dwPrx6ZwvPmAhHqdM0v6GFJdUx6Pk9DnvATSgptiF5QnpRb3ZRqdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-gnu": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-gnu/-/linux-x64-gnu-0.15.9.tgz", + "integrity": "sha512-EE6HtlWAyT1FJ4BOy+qXKqbQgsKrBeom5qjUsTUBrh2SdNeWSscgOQEaxupWlToxLX+O322L9iY07GsR0pgDuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/linux-x64-musl": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/linux-x64-musl/-/linux-x64-musl-0.15.9.tgz", + "integrity": "sha512-TGmYoNkxLxYzQTAICF7WN+FWYZ3Gg2MgKCRhnLQGQ3GPPKy616nBu4ICENgxa2r5IHnNrRSRR8wJlyXS6XK3/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@oxlint/win32-arm64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/win32-arm64/-/win32-arm64-0.15.9.tgz", + "integrity": "sha512-dA5UTFXYepfVLX2lowhAgBqKif2Ww6AwGi5rZPXXR2g6+ZenRyTxwY2WOoVZUpxwaBjG+9H/04lSUDH8nAB4JQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@oxlint/win32-x64": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/@oxlint/win32-x64/-/win32-x64-0.15.9.tgz", + "integrity": "sha512-6lqsMe8SEJ2hCvz07WDPXjaimM2lLbNj26LVWDOluENQhJ15TAmpQXv4WIhlkSM2NTDJMw3ESiQ7FPAVqaqCFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/browser-chromium": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.50.1.tgz", + "integrity": "sha512-odDVeETxPjB/TENtKVpfa/p7ZZ1/awda0tgknSDHNd4R2KrE1vrkNysc3rws3mh2ecQf6UOeI15eaUcNm5YxUg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.50.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/test": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz", + "integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.50.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.24", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.24.tgz", + "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", + "dev": true + }, + "node_modules/@promptbook/utils": { + "version": "0.69.5", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", + "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" } ], + "optional": true, + "peer": true, "dependencies": { - "spacetrim": "0.11.36" + "spacetrim": "0.11.59" } }, "node_modules/@puppeteer/browsers": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.4.tgz", - "integrity": "sha512-BdG2qiI1dn89OTUUsx2GZSpUzW+DRffR1wlMJyKxVHYrhnKoELSDxDd+2XImUkuWPEKk76H5FcM/gPFrEK1Tfw==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", - "proxy-agent": "^6.4.0", - "semver": "^7.6.2", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", "yargs": "^17.7.2" @@ -1145,6174 +1806,4391 @@ "node": ">=18" } }, - "node_modules/@puppeteer/browsers/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.0.tgz", - "integrity": "sha512-JlPfZ/C7yn5S5p0yKk7uhHTTnFlvTgLetl2VxqE518QgyM7C9bSfFTYvB/Q/ftkq0RIPY4ySxTz+/wKJ/dXC0w==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.2.tgz", + "integrity": "sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.0.tgz", - "integrity": "sha512-RDxUSY8D1tWYfn00DDi5myxKgOk6RvWPxhmWexcICt/MEC6yEMr4HNCu1sXXYLw8iAsg0D44NuU+qNq7zVWCrw==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.2.tgz", + "integrity": "sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.0.tgz", - "integrity": "sha512-emvKHL4B15x6nlNTBMtIaC9tLPRpeA5jMvRLXVbl/W9Ie7HhkrE7KQjvgS9uxgatL1HmHWDXk5TTS4IaNJxbAA==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.2.tgz", + "integrity": "sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.0.tgz", - "integrity": "sha512-fO28cWA1dC57qCd+D0rfLC4VPbh6EOJXrreBmFLWPGI9dpMlER2YwSPZzSGfq11XgcEpPukPTfEVFtw2q2nYJg==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.2.tgz", + "integrity": "sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.2.tgz", + "integrity": "sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.2.tgz", + "integrity": "sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.0.tgz", - "integrity": "sha512-2Rn36Ubxdv32NUcfm0wB1tgKqkQuft00PtM23VqLuCUR4N5jcNWDoV5iBC9jeGdgS38WK66ElncprqgMUOyomw==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.2.tgz", + "integrity": "sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.0.tgz", - "integrity": "sha512-gJuzIVdq/X1ZA2bHeCGCISe0VWqCoNT8BvkQ+BfsixXwTOndhtLUpOg0A1Fcx/+eA6ei6rMBzlOz4JzmiDw7JQ==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.2.tgz", + "integrity": "sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.0.tgz", - "integrity": "sha512-0EkX2HYPkSADo9cfeGFoQ7R0/wTKb7q6DdwI4Yn/ULFE1wuRRCHybxpl2goQrx4c/yzK3I8OlgtBu4xvted0ug==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.2.tgz", + "integrity": "sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.0.tgz", - "integrity": "sha512-GlIQRj9px52ISomIOEUq/IojLZqzkvRpdP3cLgIE1wUWaiU5Takwlzpz002q0Nxxr1y2ZgxC2obWxjr13lvxNQ==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.2.tgz", + "integrity": "sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.2.tgz", + "integrity": "sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.0.tgz", - "integrity": "sha512-N6cFJzssruDLUOKfEKeovCKiHcdwVYOT1Hs6dovDQ61+Y9n3Ek4zXvtghPPelt6U0AH4aDGnDLb83uiJMkWYzQ==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.2.tgz", + "integrity": "sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.0.tgz", - "integrity": "sha512-2DnD3mkS2uuam/alF+I7M84koGwvn3ZVD7uG+LEWpyzo/bq8+kKnus2EVCkcvh6PlNB8QPNFOz6fWd5N8o1CYg==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.2.tgz", + "integrity": "sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.0.tgz", - "integrity": "sha512-D6pkaF7OpE7lzlTOFCB2m3Ngzu2ykw40Nka9WmKGUOTS3xcIieHe82slQlNq69sVB04ch73thKYIWz/Ian8DUA==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.2.tgz", + "integrity": "sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.0.tgz", - "integrity": "sha512-HBndjQLP8OsdJNSxpNIN0einbDmRFg9+UQeZV1eiYupIRuZsDEoeGU43NQsS34Pp166DtwQOnpcbV/zQxM+rWA==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.2.tgz", + "integrity": "sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.0.tgz", - "integrity": "sha512-HxfbvfCKJe/RMYJJn0a12eiOI9OOtAUF4G6ozrFUK95BNyoJaSiBjIOHjZskTUffUrB84IPKkFG9H9nEvJGW6A==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.2.tgz", + "integrity": "sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.0.tgz", - "integrity": "sha512-HxDMKIhmcguGTiP5TsLNolwBUK3nGGUEoV/BO9ldUBoMLBssvh4J0X8pf11i1fTV7WShWItB1bKAKjX4RQeYmg==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.2.tgz", + "integrity": "sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.0.tgz", - "integrity": "sha512-xItlIAZZaiG/u0wooGzRsx11rokP4qyc/79LkAOdznGRAbOFc+SfEdfUOszG1odsHNgwippUJavag/+W/Etc6Q==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.2.tgz", + "integrity": "sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.0.tgz", - "integrity": "sha512-xNo5fV5ycvCCKqiZcpB65VMR11NJB+StnxHz20jdqRAktfdfzhgjTiJ2doTDQE/7dqGaV5I7ZGqKpgph6lCIag==", + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.2.tgz", + "integrity": "sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "node_modules/@rspack/binding": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.2.2.tgz", + "integrity": "sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } + "license": "MIT", + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.2.2", + "@rspack/binding-darwin-x64": "1.2.2", + "@rspack/binding-linux-arm64-gnu": "1.2.2", + "@rspack/binding-linux-arm64-musl": "1.2.2", + "@rspack/binding-linux-x64-gnu": "1.2.2", + "@rspack/binding-linux-x64-musl": "1.2.2", + "@rspack/binding-win32-arm64-msvc": "1.2.2", + "@rspack/binding-win32-ia32-msvc": "1.2.2", + "@rspack/binding-win32-x64-msvc": "1.2.2" + } + }, + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz", + "integrity": "sha512-h23F8zEkXWhwMeScm0ZnN78Zh7hCDalxIWsm7bBS0eKadnlegUDwwCF8WE+8NjWr7bRzv0p3QBWlS5ufkcL4eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz", + "integrity": "sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz", + "integrity": "sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz", + "integrity": "sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/codemirror": { - "version": "5.60.15", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", - "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", - "dev": true, - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "8.56.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", - "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/gl-matrix": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", - "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", - "dev": true - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/lodash": { - "version": "4.14.202", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", - "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", - "dev": true - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "dev": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/mute-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", - "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.14.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.12.tgz", - "integrity": "sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/statuses": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", - "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", - "dev": true - }, - "node_modules/@types/tern": { - "version": "0.23.9", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", - "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, - "node_modules/@types/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", - "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", - "dev": true - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.17.0.tgz", - "integrity": "sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/type-utils": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.17.0.tgz", - "integrity": "sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.17.0.tgz", - "integrity": "sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.17.0.tgz", - "integrity": "sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.17.0", - "@typescript-eslint/utils": "7.17.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.17.0.tgz", - "integrity": "sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.17.0.tgz", - "integrity": "sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/visitor-keys": "7.17.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.17.0.tgz", - "integrity": "sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.17.0", - "@typescript-eslint/types": "7.17.0", - "@typescript-eslint/typescript-estree": "7.17.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.17.0.tgz", - "integrity": "sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.17.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/browser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-2.0.4.tgz", - "integrity": "sha512-QsIkbqPqHsXvgxjCjjgKjuWKmrC0VJgpaDkuEmOy5gTnErhhifWIfp3HpH92K7cscfaIao+RlKv5f8nUMgjfmA==", - "dev": true, - "dependencies": { - "@testing-library/dom": "^10.3.1", - "@testing-library/user-event": "^14.5.2", - "@vitest/utils": "2.0.4", - "magic-string": "^0.30.10", - "msw": "^2.3.1", - "sirv": "^2.0.4", - "ws": "^8.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "playwright": "*", - "vitest": "2.0.4", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/@vitest/expect": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.4.tgz", - "integrity": "sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==", - "dev": true, - "dependencies": { - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.4.tgz", - "integrity": "sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==", - "dev": true, - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.4.tgz", - "integrity": "sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.0.4", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.4.tgz", - "integrity": "sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "magic-string": "^0.30.10", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.4.tgz", - "integrity": "sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==", - "dev": true, - "dependencies": { - "tinyspy": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/ui": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.4.tgz", - "integrity": "sha512-9SNE9ve3kgDkVTxJsY7BjqSwyqDVRJbq/AHVHZs+V0vmr/0cCX6yGT6nOahSXEsXFtKAsvRtBXKlTgr+5njzZQ==", - "dev": true, - "dependencies": { - "@vitest/utils": "2.0.4", - "fast-glob": "^3.3.2", - "fflate": "^0.8.2", - "flatted": "^3.3.1", - "pathe": "^1.1.2", - "sirv": "^2.0.4", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "2.0.4" - } - }, - "node_modules/@vitest/utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.4.tgz", - "integrity": "sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "2.0.4", - "estree-walker": "^3.0.3", - "loupe": "^3.1.1", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@wdio/config": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.39.0.tgz", - "integrity": "sha512-yNuGPMPibY91s936gnJCHWlStvIyDrwLwGfLC/NCdTin4F7HL4Gp5iJnHWkJFty1/DfFi8jjoIUBNLM8HEez+A==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/config/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/config/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@wdio/config/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/@wdio/config/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/logger/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@wdio/protocols": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", - "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", - "dev": true - }, - "node_modules/@wdio/repl": { - "version": "8.24.12", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", - "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.39.0.tgz", - "integrity": "sha512-86lcYROTapOJuFd9ouomFDfzDnv3Kn+jE0RmqfvN9frZAeLVJ5IKjX9M6HjplsyTZhjGO1uCaehmzx+HJus33Q==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-jY+n6jlGeK+9Tx8T659PKLwMQTGpLW5H78CSEWgZLbjbVSr2LfGR8Lx0CRktNXxAtqEVZPj16Pi74OtAhvhE6Q==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.38.0", - "@wdio/types": "8.39.0", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.5.0", - "geckodriver": "^4.3.1", - "get-port": "^7.0.0", - "import-meta-resolve": "^4.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "split2": "^4.2.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", - "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", - "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", - "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/@zip.js/zip.js": { - "version": "2.7.47", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.47.tgz", - "integrity": "sha512-jmtJMA3/Jl4rMzo/DZ79s6g0CJ1AZcNAO6emTy/vHfIKAB/iiFY7PLs6KmbRTJ+F8GnK2eCLnjQfCCneRxXgzg==", - "dev": true, - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", - "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dev": true, - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dev": true, - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/archiver-utils/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/archiver-utils/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/archiver-utils/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/archiver/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/archiver/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/archiver/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-equal": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", - "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/b4a": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "dev": true, - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", - "dev": true, - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "dev": true, - "optional": true, - "dependencies": { - "streamx": "^2.18.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/bonjour-service": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", - "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brfs": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz", - "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==", - "dependencies": { - "quote-stream": "^1.0.1", - "resolve": "^1.1.5", - "static-module": "^2.2.0", - "through2": "^2.0.0" - }, - "bin": { - "brfs": "bin/cmd.js" - } - }, - "node_modules/brfs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz", + "integrity": "sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==", + "cpu": [ + "x64" ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz", + "integrity": "sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz", + "integrity": "sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.2.2.tgz", + "integrity": "sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==", + "cpu": [ + "ia32" + ], "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz", + "integrity": "sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=14.16" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "node_modules/@rspack/cli": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.2.2.tgz", + "integrity": "sha512-d1wsIqmQHjqfo2KKx9TOOW7M4PnD2Viv9FbosXRW/lisvPFJUTwg87onv2x3z4KTCHqplH9T4MCeKmCj+ZNKOw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "1.0.10", + "colorette": "2.0.19", + "exit-hook": "^4.0.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-bundle-analyzer": "4.6.1", + "yargs": "17.6.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "bin": { + "rspack": "bin/rspack.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x", + "@rspack/tracing": "^1.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001596", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz", - "integrity": "sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" + "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", - "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@rspack/cli/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "acorn": "^8.11.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } + "node_modules/@rspack/cli/node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@rspack/cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">= 10" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@rspack/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@rspack/cli/node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "node_modules/@rspack/cli/node_modules/sirv": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", + "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^1.0.0" + }, "engines": { - "node": ">=6.0" + "node": ">= 10" } }, - "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "node_modules/@rspack/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "mitt": "3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "peerDependencies": { - "devtools-protocol": "*" + "engines": { + "node": ">=8" } }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/@rspack/cli/node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "node_modules/@rspack/cli/node_modules/webpack-bundle-analyzer": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.6.1.tgz", + "integrity": "sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==", "dev": true, "dependencies": { - "source-map": "~0.6.0" + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" }, "engines": { - "node": ">= 10.0" + "node": ">= 10.13.0" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "node_modules/@rspack/cli/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=8.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/@rspack/cli/node_modules/yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/@rspack/core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.2.2.tgz", + "integrity": "sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@module-federation/runtime-tools": "0.8.4", + "@rspack/binding": "1.2.2", + "@rspack/lite-tapable": "1.0.1", + "caniuse-lite": "^1.0.30001616" + }, "engines": { - "node": ">=6" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@rspack/tracing": "^1.x", + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@rspack/tracing": { + "optional": true + }, + "@swc/helpers": { + "optional": true + } } }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/@rspack/dev-server": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.0.10.tgz", + "integrity": "sha512-iDsEtP0jNHRm4LJxL00QFTlOuqkdxIFxnd69h0KrFadmtxAWiDLIe4vYdZXWF74w4MezsJFx6dB2nUM/Ok8utA==", "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "connect-history-api-fallback": "^2.0.0", + "express": "^4.19.2", + "http-proxy-middleware": "^2.0.6", + "mime-types": "^2.1.35", + "p-retry": "4.6.2", + "webpack-dev-middleware": "^7.4.2", + "webpack-dev-server": "5.0.4", + "ws": "^8.16.0" + }, "engines": { - "node": ">= 12" + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@rspack/core": "*" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12", + "npm": ">=6" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, + "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/clone-deep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/codemirror": { - "version": "5.65.16", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", - "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + "node_modules/@types/codemirror": { + "version": "5.60.15", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz", + "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==", + "dev": true, + "dependencies": { + "@types/tern": "*" + } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "dev": true, "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/comlink": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", - "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==", - "dev": true - }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, - "engines": { - "node": "^12.20.0 || >=14" + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, + "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/compress-commons/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, - "engines": { - "node": ">=0.8.x" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/compress-commons/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/@types/gl-matrix": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/gl-matrix/-/gl-matrix-2.4.5.tgz", + "integrity": "sha512-0L8Mq1+oaIW0oVzGUDbSW+HnTjCNb4CmoIQE5BkoHt/A7x20z0MJ1PnwfH3atty/vbWLGgvJwVu2Mz3SKFiEFw==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, + "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/node": "*" } }, - "node_modules/compress-commons/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/@types/http-server": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/@types/http-server/-/http-server-0.12.4.tgz", + "integrity": "sha512-vsn4pvP2oRFALLuM5Rca6qUmSPG7u0VNjOuqvL57l3bKldQRWdUZPeSiARhzagDxgfNCHn/o8WlWk4KinBauUg==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "@types/connect": "*" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/@types/jsdom": { + "version": "21.1.7", + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz", + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==", "dev": true, "dependencies": { - "ms": "2.0.0" + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" } }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==", "dev": true }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/condense-newlines": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", - "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dev": true, "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "@types/lodash": "*" } }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, - "engines": { - "node": ">=0.8" - } + "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@types/node": { + "version": "22.13.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", + "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" + "undici-types": "~6.20.0" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dev": true, - "engines": { - "node": ">= 0.6" + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "node_modules/@types/nunjucks": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@types/nunjucks/-/nunjucks-3.2.6.tgz", + "integrity": "sha512-pHiGtf83na1nCzliuAdq8GowYiXvH5l931xZ0YEHaLMNFgynpEqx+IPStlu7UaDkehfvl01e4x/9Tpwhy7Ue3w==", + "dev": true }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true, + "license": "MIT" }, - "node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" + "license": "MIT", + "dependencies": { + "@types/express": "*" } }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, + "license": "MIT", "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/crc32-stream/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true, - "engines": { - "node": ">=0.8.x" - } + "optional": true, + "peer": true }, - "node_modules/crc32-stream/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, + "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@types/node": "*" } }, - "node_modules/crc32-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true + }, + "node_modules/@types/tern": { + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.9.tgz", + "integrity": "sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==", "dev": true, "dependencies": { - "safe-buffer": "~5.2.0" + "@types/estree": "*" } }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true + }, + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/ws": { + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { - "node-fetch": "^2.6.12" + "@types/node": "*" } }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "@types/yargs-parser": "*" } }, - "node_modules/cross-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/cross-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, - "node_modules/cross-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "@types/node": "*" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", + "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "node_modules/@typescript-eslint/parser": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "dev": true, + "license": "MIT", "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 18.12.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/css-shorthand-properties": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", - "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", - "dev": true - }, - "node_modules/css-value": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", - "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", - "dev": true + "node_modules/@typescript-eslint/type-utils": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" + } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/@typescript-eslint/types": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/fb55" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", "dev": true, - "bin": { - "cssesc": "bin/cssesc" + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">=4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "node_modules/@typescript-eslint/utils": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", + "dev": true, + "license": "MIT", "dependencies": { - "cssom": "0.3.x" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "@typescript-eslint/types": "8.23.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=0.10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">= 12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "node_modules/@vitest/browser": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.0.5.tgz", + "integrity": "sha512-5WAWJoucuWcGYU5t0HPBY03k9uogbUEIu4pDmZHoB4Dt+6pXqzDbzEmxGjejZSitSYA3k/udYfuotKNxETVA3A==", + "dev": true, + "license": "MIT", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.6.1", + "@vitest/mocker": "3.0.5", + "@vitest/utils": "3.0.5", + "magic-string": "^0.30.17", + "msw": "^2.7.0", + "sirv": "^3.0.0", + "tinyrainbow": "^2.0.0", + "ws": "^8.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "3.0.5", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } } }, - "node_modules/data-urls/node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "deprecated": "Use your platform's native atob() and btoa() methods instead" - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/@vitest/browser/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true + "node_modules/@vitest/expect": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", + "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/@vitest/mocker": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", + "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "@vitest/spy": "3.0.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" }, "peerDependenciesMeta": { - "supports-color": { + "msw": { + "optional": true + }, + "vite": { "optional": true } } }, - "node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "node_modules/@vitest/pretty-format": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", + "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "node_modules/@vitest/runner": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", + "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" + "@vitest/utils": "3.0.5", + "pathe": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/@vitest/snapshot": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", + "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.5", + "magic-string": "^0.30.17", + "pathe": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "node_modules/@vitest/spy": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", + "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/@vitest/ui": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-3.0.5.tgz", + "integrity": "sha512-gw2noso6WI+2PeMVCZFntdATS6xl9qhQcbhkPQ9sOmx/Xn0f4Bx4KDSbD90jpJPF0l5wOzSoGCmKyVR3W612mg==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.5", + "fflate": "^0.8.2", + "flatted": "^3.3.2", + "pathe": "^2.0.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "3.0.5" } }, - "node_modules/deepmerge-ts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", - "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "node_modules/@vitest/ui/node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, "engines": { - "node": ">=16.0.0" + "node": ">=18" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "node_modules/@vitest/utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", + "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", "dev": true, + "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" + "@vitest/pretty-format": "3.0.5", + "loupe": "^3.1.2", + "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/@vitest/web-worker": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@vitest/web-worker/-/web-worker-3.0.5.tgz", + "integrity": "sha512-Kg87g2tEpHHctSzcZgmOHjeSw0+IjLWs54bF6SnJCzw4BgYewDdSx/gD6m506Eo6ZDXbGRHmdPZ4ugOx9GJ46w==", "dev": true, - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "debug": "^4.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "3.0.5" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "node_modules/@wdio/config": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.2.8.tgz", + "integrity": "sha512-EGMmBPGJbz6RmgMjebRWkWu3fGyeTIRcusF4UA4f2tiUEKY8nbzUO/ZyDjVQNR+YVB40q0jcqAqpszYRrIzzeg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "execa": "^5.0.0" + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": ">=18.20.0" + } + }, + "node_modules/@wdio/config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">= 10" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/default-gateway/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/@wdio/config/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/default-gateway/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/@wdio/config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@wdio/config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/default-gateway/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/@wdio/logger": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", + "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, "engines": { - "node": ">=10.17.0" + "node": ">=18.20.0" } }, - "node_modules/default-gateway/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/default-gateway/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/default-gateway/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=6" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "clone": "^1.0.2" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/@wdio/protocols": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", + "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", "dev": true, - "engines": { - "node": ">=0.8" - } + "optional": true, + "peer": true }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "node_modules/@wdio/repl": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-9.0.8.tgz", + "integrity": "sha512-3iubjl4JX5zD21aFxZwQghqC3lgu+mSs8c3NaiYYNCC+IT5cI/8QuKlgh9s59bu+N3gG988jqMJeCYlKuUv/iw==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, "engines": { - "node": ">=10" + "node": ">=18.20.0" } }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "undici-types": "~6.19.2" } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/@wdio/repl/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "peer": true }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@wdio/types": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.2.2.tgz", + "integrity": "sha512-nHZ9Ne9iRQFJ1TOYKUn4Fza69IshTTzk6RYmSZ51ImGs9uMZu0+S0Jm9REdly+VLN3FzxG6g2QSe0/F3uNVPdw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@types/node": "^20.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18.20.0" } }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" + "undici-types": "~6.19.2" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } + "node_modules/@wdio/types/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/@wdio/utils": { + "version": "9.2.8", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.2.8.tgz", + "integrity": "sha512-rKm5FXkpsCyeqh8tdirtRUHvgNytWNMiaVKdctsvKOJvqnDVPAAQcz9Wmgo7bSwoLwtSHcDaRoxY7olV7J4QnA==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "^2.2.0", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.2.2", + "decamelize": "^6.0.0", + "deepmerge-ts": "^7.0.3", + "edgedriver": "^5.6.1", + "geckodriver": "^4.3.3", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.2.24", + "safaridriver": "^0.1.2", + "split2": "^4.2.0", + "wait-port": "^1.1.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=18.20.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, - "engines": { - "node": ">=6" + "optional": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } + "optional": true, + "peer": true }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/devtools-protocol": { - "version": "0.0.1302984", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz", - "integrity": "sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==", - "dev": true + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "utila": "~0.4" + "@xtuc/long": "4.2.2" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "deprecated": "Use your platform's native DOMException instead", + "optional": true, + "peer": true, "dependencies": { - "webidl-conversions": "^4.0.2" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dependencies": { - "readable-stream": "^2.0.2" + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.54", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", + "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "node_modules/abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/edge-paths": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", - "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/which": "^2.0.1", - "which": "^2.0.2" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/shirshak55" + "node": ">=6.5" } }, - "node_modules/edgedriver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.0.tgz", - "integrity": "sha512-IeJXEczG+DNYBIa9gFgVYTqrawlxmc9SUqUsWU2E98jOsO/amA7wzabKOS8Bwgr/3xWoyXCJ6yGFrbFKrilyyQ==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^8.28.0", - "@zip.js/zip.js": "^2.7.44", - "decamelize": "^6.0.0", - "edge-paths": "^3.0.5", - "node-fetch": "^3.3.2", - "which": "^4.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "bin": { - "edgedriver": "bin/edgedriver.js" - } - }, - "node_modules/edgedriver/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, "engines": { - "node": ">=16" + "node": ">= 0.6" } }, - "node_modules/edgedriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "dependencies": { - "isexe": "^3.1.1" - }, "bin": { - "node-which": "bin/which.js" + "acorn": "bin/acorn" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": ">=0.4.0" } }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "bin": { - "editorconfig": "bin/editorconfig" + "acorn": "bin/acorn" }, "engines": { - "node": ">=14" + "node": ">=0.4.0" } }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "engines": { - "node": ">=14" + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=0.4.0" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.699", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", - "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", - "dev": true - }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, "engines": { - "node": ">= 4" + "node": ">= 14" } }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "dependencies": { - "once": "^1.4.0" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "optional": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=8.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/envinfo": { - "version": "7.11.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", - "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" + "ansi-html": "bin/ansi-html" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" } }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">= 0.4" + "node": ">= 8" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "hasown": "^2.0.0" + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 14" } }, - "node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "node_modules/archiver-utils/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=18" + "node": ">=0.8.x" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" - } - }, - "node_modules/esbuild-loader": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-4.2.2.tgz", - "integrity": "sha512-Mdq/A1L8p37hkibp8jGFwuQTDSWhDmlueAefsrCPRwNWThEOlQmIglV7Gd6GE2mO5bt7ksfxKOMwkuY7jjVTXg==", + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "esbuild": "^0.21.0", - "get-tsconfig": "^4.7.0", - "loader-utils": "^2.0.4", - "webpack-sources": "^1.4.3" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" + "url": "https://github.com/sponsors/isaacs" }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, "optional": true, - "os": [ - "aix" - ], + "peer": true + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "optional": true, - "os": [ - "android" - ], + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/archiver/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "optional": true, - "os": [ - "android" - ], + "peer": true, "engines": { - "node": ">=12" + "node": ">=0.8.x" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/archiver/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "dequal": "^2.0.3" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/array-equal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { - "node": ">=12" + "node": ">=0.8" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", "dev": true, "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/esbuild-loader/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" } }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "bare-os": "^2.1.0" } }, - "node_modules/esbuild-loader/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/bare-stream": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.5.2.tgz", + "integrity": "sha512-QK6bePvszntxgPKdVXciYzjlWv2Ry1mQuUqyUUzd27G7eLupl6d0K5AGJfnfyFAdgy5tRolHP/zbaUMslLceOg==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "optional": true, + "peer": true, + "dependencies": { + "streamx": "^2.21.0" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.0.0" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=8" } }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/eslint-formatter-codeframe": { - "version": "7.32.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", - "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "chalk": "^4.0.0" + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, + "optional": true, + "peer": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" + "fill-range": "^7.1.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "node": ">=8" } }, - "node_modules/eslint-interactive": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/eslint-interactive/-/eslint-interactive-10.8.0.tgz", - "integrity": "sha512-bsMSr0NVyxoSbKbA3Rn8so5+A9q+Zu8xExiIM18umPjrqfBAN8WcJfsWvfc9Myfiqn2WwLDM9mRglbx+Hp+z3Q==", + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "boxen": "^7.0.2", - "chalk": "^5.0.1", - "comlink": "^4.3.1", - "enquirer": "^2.3.6", - "eslint-formatter-codeframe": "^7.32.1", - "estraverse": "^5.3.0", - "find-cache-dir": "^4.0.0", - "is-installed-globally": "^0.4.0", - "ora": "^6.1.2", - "strip-ansi": "^7.0.1", - "table": "^6.8.1", - "terminal-link": "^3.0.0", - "yargs": "^17.5.1" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { - "eslint-interactive": "bin/eslint-interactive.js" + "browserslist": "cli.js" }, "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/eslint-interactive/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/eslint-interactive/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=8.0.0" } }, - "node_modules/eslint-interactive/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "run-applescript": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, + "license": "MIT", "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, - "dependencies": { - "ms": "^2.1.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-import": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", - "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.15.0" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=4" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", + "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/call-bound": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz", + "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==", "dev": true, "dependencies": { - "ms": "^2.1.1" + "call-bind": "^1.0.8", + "get-intrinsic": "^1.2.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/caniuse-lite": { + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=12" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 16" } }, - "node_modules/eslint-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==", + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/eslint": "^8.37.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">=18.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^8.0.0", - "webpack": "^5.0.0" + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "node_modules/cheerio-select/node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, - "peerDependencies": { - "ajv": "^8.8.2" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/cheerio-select/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/cheerio-select/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": "*" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/cheerio/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "domelementtype": "^2.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/cheerio/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "node_modules/cheerio/node_modules/htmlparser2": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "optional": true, + "peer": true, "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dependencies": { + "is-glob": "^4.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">= 0.6" + "node": ">=6.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">= 12" } }, - "node_modules/execa": { + "node_modules/cliui": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=12" } }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/execa/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "path-key": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/execa/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/execa/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/clone-deep/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, + "node_modules/codemirror": { + "version": "5.65.16", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz", + "integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" + "node": ">=7.0.0" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "side-channel": "^1.0.4" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "is-extendable": "^0.1.0" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 14" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/compress-commons/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, + "optional": true, + "peer": true, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": ">=0.8.x" } }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "pump": "^3.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/extsprintf": { + "node_modules/compress-commons/node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/falafel/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" + "node_modules/compression": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.8.0" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, + "license": "MIT", "engines": { - "node": ">=8.6.0" + "node": ">= 0.6" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/condense-newlines": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", + "integrity": "sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==", "dependencies": { - "is-glob": "^4.0.1" + "extend-shallow": "^2.0.1", + "is-whitespace": "^0.3.0", + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 4.9.1" + "node": ">=0.8" } }, - "node_modules/fastq": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", - "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "dependencies": { - "reusify": "^1.0.4" + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.6" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", "dev": true, - "dependencies": { - "pend": "~1.2.0" + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "node_modules/core-js": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz", + "integrity": "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">= 0.4.0" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "flat-cache": "^3.0.4" + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">= 14" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/crc32-stream/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=0.8.x" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/crc32-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ms": "2.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=14.16" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/css-shorthand-properties": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", + "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, + "optional": true, + "peer": true + }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=10" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "bin": { - "flat": "cli.js" + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/cssstyle": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.2.1.tgz", + "integrity": "sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "@asamuzakjp/css-color": "^2.8.2", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=18" } }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "optional": true, + "peer": true, "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">= 12" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "dependencies": { - "is-callable": "^1.1.3" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ms": "^2.1.3" }, "engines": { - "node": ">=4" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "dependencies": { - "color-name": "1.1.3" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/deepmerge-ts": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=0.8.0" + "node": ">=16.0.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, + "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, "engines": { - "node": ">=4" + "node": ">= 10" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.4" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, "engines": { - "node": ">=4" + "node": ">= 14" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "dev": true, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { - "node": ">=6" + "node": ">=0.4.0" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 10.0.0" + "node": ">= 0.8" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { - "node": ">= 14.17" + "node": ">=6" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, "engines": { - "node": ">=12.20.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "license": "Apache-2.0", + "optional": true, "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">=14.14" + "node": ">=6" } }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "engines": { - "node": ">= 10.0.0" + "license": "MIT" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "optional": true, + "peer": true + }, + "node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^4.0.2" } }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", - "dev": true + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" }, - "node_modules/fs.realpath": { + "node_modules/dunder-proto": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz", + "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==", "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.4" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "@types/which": "^2.0.1", + "which": "^2.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/shirshak55" } }, - "node_modules/geckodriver": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.2.tgz", - "integrity": "sha512-/JFJ7DJPJUvDhLjzQk+DwjlkAmiShddfRHhZ/xVL9FWbza5Bi3UMGmmerEKqD69JbRs7R81ZW31co686mdYZyA==", + "node_modules/edgedriver": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", + "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { - "@wdio/logger": "^8.28.0", - "@zip.js/zip.js": "^2.7.44", + "@wdio/logger": "^8.38.0", + "@zip.js/zip.js": "^2.7.48", "decamelize": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.4", + "edge-paths": "^3.0.5", + "fast-xml-parser": "^4.4.1", "node-fetch": "^3.3.2", - "tar-fs": "^3.0.6", "which": "^4.0.0" }, "bin": { - "geckodriver": "bin/geckodriver.js" + "edgedriver": "bin/edgedriver.js" + } + }, + "node_modules/edgedriver/node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.13 || >=18 || >=20" + "node": "^16.13 || >=18" } }, - "node_modules/geckodriver/node_modules/isexe": { + "node_modules/edgedriver/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/edgedriver/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/edgedriver/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=16" } }, - "node_modules/geckodriver/node_modules/which": { + "node_modules/edgedriver/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/edgedriver/node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -7323,322 +6201,336 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "node_modules/editorconfig": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", + "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=14" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, + "node_modules/editorconfig/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "engines": { - "node": "*" + "node": ">=14" } }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, + "node_modules/editorconfig/node_modules/minimatch": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", + "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "brace-expansion": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", - "dev": true, "engines": { - "node": ">=16" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.83", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz", + "integrity": "sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ==", "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC", + "optional": true, + "peer": true }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "node_modules/encoding-sniffer/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/get-uri/node_modules/data-uri-to-buffer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" + "node": ">=0.10.0" } }, - "node_modules/gl-matrix": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", - "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" - }, - "node_modules/glob": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz", - "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^4.0.1", - "minimatch": "^10.0.0", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "once": "^1.4.0" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": "20 || >=22" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" + "node_modules/es-abstract": { + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/glsl-editor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-editor/-/glsl-editor-1.0.0.tgz", - "integrity": "sha512-eku+MXM8P3lXU8yhGdChkKdqorNrGmG+21YT/veoxODbqPEleBXOwXV76L6T9dnXXjt9elY7z9ctxBAyTLtOqg==", + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, "dependencies": { - "brfs": "^1.2.0", - "codemirror": "^4.5.0", - "element-size": "^1.1.1", - "events": "^1.0.2", - "inherits": "^2.0.1", - "insert-css": "^0.2.0", - "through2": "^0.6.1", - "xtend": "^4.0.0" + "hasown": "^2.0.0" } }, - "node_modules/glsl-editor/node_modules/codemirror": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-4.13.0.tgz", - "integrity": "sha512-+KOX1KjxkdzFJibjxg4u7r5uuLXG6M9cmVbio7x5qAyXcyT0Y437DPMP3AEmD1bGxoi+xFx21B84W0MfIuTfxQ==" - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { "node": ">=10" @@ -7647,895 +6539,1014 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/graphql": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", - "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "node_modules/eslint": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.19.0.tgz", + "integrity": "sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==", "dev": true, + "license": "MIT", "dependencies": { - "duplexer": "^0.1.2" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.19.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/eslint-formatter-codeframe": { + "version": "7.32.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-codeframe/-/eslint-formatter-codeframe-7.32.1.tgz", + "integrity": "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "chalk": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/eslint-formatter-codeframe/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "@babel/highlight": "^7.10.4" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", + "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", "dev": true, + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.3.7", + "enhanced-resolve": "^5.15.0", + "fast-glob": "^3.3.2", + "get-tsconfig": "^4.7.5", + "is-bun-module": "^1.0.2", + "is-glob": "^4.0.3", + "stable-hash": "^0.0.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": ">=8" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "^2.1.1" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" + "node": "*" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { - "he": "bin/he" + "semver": "bin/semver.js" } }, - "node_modules/headers-polyfill": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", - "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "node_modules/eslint-plugin-oxlint": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/eslint-plugin-oxlint/-/eslint-plugin-oxlint-0.15.9.tgz", + "integrity": "sha512-3XsiY+Uz8bbU+v3O9Kuf0a9qg2P3vIWydl1jiOVkwUECoa4MTtfR787uvFeRFJQVXiGuFXBU5mOpusXyiMFL5Q==", "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "jsonc-parser": "^3.3.1" } }, - "node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "node_modules/eslint-rspack-plugin": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-rspack-plugin/-/eslint-rspack-plugin-4.2.1.tgz", + "integrity": "sha512-jv+VggchVC56U9ZxP2RUXTVOeOyjKVuTxGSQdp6YkPLLi9JTHFW5Fwkqi84NrOD3itBQz5m+Agvx6faAV1MJbg==", + "dev": true, "dependencies": { - "whatwg-encoding": "^1.0.1" + "@types/eslint": "^8.56.10", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "schema-utils": "^4.2.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^8.0.0 || ^9.0.0" } }, - "node_modules/html-entities": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", - "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "node_modules/eslint-rspack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "node_modules/eslint-rspack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" + "fast-deep-equal": "^3.1.3" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "ajv": "^8.8.2" } }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/eslint-rspack-plugin/node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">= 12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/html-webpack-plugin": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", - "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "node_modules/eslint-rspack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/eslint-rspack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">=10.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "url": "https://opencollective.com/webpack" } }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "node_modules/eslint-rspack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 0.8" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 14" + "node": "*" } }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=4" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=0.10" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "estraverse": "^5.2.0" }, "engines": { - "node": ">= 14" + "node": ">=4.0" } }, - "node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=16.17.0" + "node": ">=4.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">= 0.6" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">= 4" - } - }, - "node_modules/ikonate": { - "version": "1.1.1", - "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", - "integrity": "sha512-cGhs9mJ1NG+yZHOSuvGbWxXV9ysDZAQApq1oHpMytHJam3BRl4JgBzO55ANUA9vpKT4uZcGhipGBUhAMPpPIfA==", - "license": "MIT", - "dependencies": { - "jsdom": "11.10.0", - "pretty": "^2.0.0", - "xmldom": "^0.1.27" + "node": ">=6" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=8" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", - "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", - "dev": true, + "node": ">= 0.10.0" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "engines": { - "node": ">=0.8.19" + "node": ">= 0.6" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "ms": "2.0.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { + "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, - "node_modules/insert-css": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/insert-css/-/insert-css-0.2.0.tgz", - "integrity": "sha512-tXSEsS2BJfEdtBuKzqfbbOijbWQC+y0i5pGd4OXNBauhWZ5lLNs7nb03tyONVuvwu6RXyQqWwqoRJV3jKR7+ag==" + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { - "node": ">= 0.4" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, "engines": { - "node": ">=10.13.0" + "node": ">=0.10.0" } }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" }, "engines": { - "node": ">= 12" + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/ip-address/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "node_modules/extract-zip/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "engines": { - "node": ">= 10" + "node": "*" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/extract-zip/node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true, + "peer": true }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { - "binary-extensions": "^2.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", + "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", "dev": true, - "engines": { - "node": ">= 0.4" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + }, + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "strnum": "^1.0.5" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "fxparser": "src/cli/cli.js" } }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "node_modules/fastq": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.0.tgz", + "integrity": "sha512-zGygtijUMT7jnk3h26kUms3BkSDp4IfIKjmnqI2tvx6nuBfiF1UqOxbnLfzdv+apBy+53oaImsKtMw/xYbW+1w==", + "dev": true, "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "reusify": "^1.0.4" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "has-tostringtag": "^1.0.0" + "websocket-driver": ">=0.5.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.0" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.20 || >= 14.13" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=16.0.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { - "is-extglob": "^2.1.1" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "ms": "2.0.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=10" @@ -8544,113 +7555,166 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, - "engines": { - "node": ">=12" + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=16" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "engines": { - "node": ">= 0.4" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/is-network-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.0.1.tgz", - "integrity": "sha512-OwQXkwBJeESyhFw+OumbJVD58BFBJJI5OM5S1+eyrDKlgDZPX2XNT5gXS56GSD3NPbbwUuMlR1Q71SRp5SobuQ==", + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=0.12.0" + "node": ">= 6" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8659,120 +7723,113 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/fzstd": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/fzstd/-/fzstd-0.1.1.tgz", + "integrity": "sha512-dkuVSOKKwh3eas5VkJy1AW1vFpet8TA/fGmVA5krThl8YcOVE/8ZIoEA1+U1vEn5ckxxhLirSdY837azmbaNHA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/geckodriver": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.5.1.tgz", + "integrity": "sha512-lGCRqPMuzbRNDWJOQcUqhNqPvNsIFu6yzXF8J/6K3WCYFd2r5ckbeF7h1cxsnjA7YLSEiWzERCt6/gjZ3tW0ug==", "dev": true, + "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { - "has-tostringtag": "^1.0.0" + "@wdio/logger": "^9.0.0", + "@zip.js/zip.js": "^2.7.48", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.6", + "which": "^4.0.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "geckodriver": "bin/geckodriver.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.13 || >=18 || >=20" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, + "optional": true, + "peer": true, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16" } }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "which-typed-array": "^1.1.11" + "isexe": "^3.1.1" }, - "engines": { - "node": ">= 0.4" + "bin": { + "node-which": "bin/which.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/get-intrinsic": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.5.tgz", + "integrity": "sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind-apply-helpers": "^1.0.0", + "dunder-proto": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-whitespace": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", - "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, + "optional": true, + "peer": true, "engines": { "node": ">=16" }, @@ -8780,1320 +7837,1466 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/jackspeak": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", - "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { - "node": "20 || >=22" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "node_modules/get-uri": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 14" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 14" } }, - "node_modules/js-beautify": { - "version": "1.14.11", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", - "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.3", - "glob": "^10.3.3", - "nopt": "^7.2.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" + "assert-plus": "^1.0.0" } }, - "node_modules/js-beautify/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/gl-matrix": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.1.0.tgz", + "integrity": "sha512-526NA+3EA+ztAQi0IZpSWiM0fyQXIp7IbRvfJ4wS/TjjQD0uv0fVybXwwqqSOlq33UckivI0yMDlVtboWm3k7A==" + }, + "node_modules/glob": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", + "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, + "engines": { + "node": "20 || >=22" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-beautify/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "is-glob": "^4.0.3" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">=10.13.0" } }, - "node_modules/js-beautify/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/js-beautify/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/glob/node_modules/minimatch": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", + "dev": true, "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" + "engines": { + "node": ">=18" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", - "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, "dependencies": { - "abab": "^1.0.4", - "acorn": "^5.3.0", - "acorn-globals": "^4.1.0", - "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": ">= 0.2.37 < 0.3.0", - "data-urls": "^1.0.0", - "domexception": "^1.0.0", - "escodegen": "^1.9.0", - "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.2.0", - "nwmatcher": "^1.4.3", - "parse5": "4.0.0", - "pn": "^1.1.0", - "request": "^2.83.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.3", - "w3c-hr-time": "^1.0.1", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.0", - "ws": "^4.0.0", - "xml-name-validator": "^3.0.0" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "bin": { - "acorn": "bin/acorn" + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.9.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.9.0.tgz", + "integrity": "sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, - "node_modules/jsdom/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "duplexer": "^0.1.2" }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "engines": { + "node": ">=10" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { - "node": ">=4.0" + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "engines": { + "node": ">=6" } }, - "node_modules/jsdom/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/jsdom/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "dunder-proto": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsdom/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" } }, - "node_modules/jsdom/node_modules/ws": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", - "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0" + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/htmlfy": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", + "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/http-parser-js": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "dependencies": { - "universalify": "^2.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/jsonfile/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">= 10.0.0" + "node": ">= 14" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">=0.6.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { - "json-buffer": "3.0.1" + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "node_modules/http-server/node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "whatwg-encoding": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/ky": { - "version": "0.33.3", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", - "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "node_modules/http-server/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "engines": { - "node": ">=14.16" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "node_modules/http-server/node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { - "readable-stream": "^2.0.5" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">= 0.6.3" + "node": ">=0.8", + "npm": ">=1.3.7" } }, - "node_modules/left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "deprecated": "use String.prototype.padStart()" - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "dependencies": { - "immediate": "~3.0.5" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "engines": { - "node": ">=6.11.5" + "node": ">=10.18" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=8.9.0" + "node": ">=0.10.0" } }, - "node_modules/locate-app": { - "version": "2.4.21", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.21.tgz", - "integrity": "sha512-ySSBwlUnVKoLgw39q8YaNtvklhaTMoVqBf2+CuY3hkOFuWubHAJ6NJuTjv+jfTV1FuOgKsigRdsYUIeVgKHvNA==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "github", - "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], + "optional": true, + "peer": true + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ikonate": { + "version": "1.1.1", + "resolved": "git+ssh://git@github.com/mikolajdobrucki/ikonate.git#a86b4107c6ec717e7877f880a930d1ccf0b59d89", + "integrity": "sha512-cGhs9mJ1NG+yZHOSuvGbWxXV9ysDZAQApq1oHpMytHJam3BRl4JgBzO55ANUA9vpKT4uZcGhipGBUhAMPpPIfA==", + "license": "MIT", "dependencies": { - "@promptbook/utils": "0.58.0", - "type-fest": "2.13.0", - "userhome": "1.0.0" + "jsdom": "11.10.0", + "pretty": "^2.0.0", + "xmldom": "^0.1.27" } }, - "node_modules/locate-app/node_modules/type-fest": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", - "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", - "dev": true, + "node_modules/ikonate/node_modules/acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=12.20" + "node": ">=0.4.0" + } + }, + "node_modules/ikonate/node_modules/cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==", + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/ikonate/node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/ikonate/node_modules/data-urls/node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/ikonate/node_modules/data-urls/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/ikonate/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/ikonate/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/ikonate/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/ikonate/node_modules/jsdom": { + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.10.0.tgz", + "integrity": "sha512-x5No5FpJgBg3j5aBwA8ka6eGuS5IxbC8FOkmyccKvObtFT0bDMict/LOxINZsZGZSfGdNomLZ/qRV9Bpq/GIBA==", + "dependencies": { + "abab": "^1.0.4", + "acorn": "^5.3.0", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.0", + "escodegen": "^1.9.0", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.2.0", + "nwmatcher": "^1.4.3", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.83.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.3", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.0", + "ws": "^4.0.0", + "xml-name-validator": "^3.0.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/ikonate/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { - "p-locate": "^5.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lodash.zip": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", - "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, + "node_modules/ikonate/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "node_modules/ikonate/node_modules/parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, - "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", - "dev": true, + "node_modules/ikonate/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "node": ">= 0.8.0" } }, - "node_modules/loglevel-plugin-prefix": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", - "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", - "dev": true + "node_modules/ikonate/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, + "node_modules/ikonate/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "get-func-name": "^2.0.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, + "node_modules/ikonate/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dependencies": { - "tslib": "^2.0.3" + "punycode": "^2.1.0" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node_modules/ikonate/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/lru-cache": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", - "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", - "dev": true, - "engines": { - "node": "20 || >=22" + "node_modules/ikonate/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/ikonate/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" + "node_modules/ikonate/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/ikonate/node_modules/whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "dev": true, + "node_modules/ikonate/node_modules/ws": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-4.1.0.tgz", + "integrity": "sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "node_modules/ikonate/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "optional": true, + "peer": true }, - "node_modules/memfs": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.7.7.tgz", - "integrity": "sha512-x9qc6k88J/VVwnfTkJV8pRRswJ2156Rc4w5rciRqKceFDZ0y1MqsNL9pkg5sE0GOcDzZYbonreALhaHzg1siFw==", + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "tslib": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">= 4.0.0" + "node": ">=6" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/merge-source-map": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==", - "dependencies": { - "source-map": "^0.5.6" - } - }, - "node_modules/merge-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, - "engines": { - "node": ">= 8" + "optional": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.8.19" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8.6" + "node": ">= 0.4" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { - "node": ">= 0.6" + "node": ">=10.13.0" } }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "mime-db": "1.52.0" + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" }, "engines": { - "node": ">= 0.6" + "node": ">= 12" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 10" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", - "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "dependencies": { - "schema-utils": "^4.0.0", - "tapable": "^2.2.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "has-bigints": "^1.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "binary-extensions": "^2.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=8" } }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/is-bun-module": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", + "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "semver": "^7.6.3" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/msw": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.3.4.tgz", - "integrity": "sha512-sHMlwrajgmZSA2l1o7qRSe+azm/I+x9lvVVcOxAzi4vCtH8uVPJk1K5BQYDkzGl+tt0RvM9huEXXdeGrgcc79g==", + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@bundled-es-modules/cookie": "^2.0.0", - "@bundled-es-modules/statuses": "^1.0.1", - "@bundled-es-modules/tough-cookie": "^0.1.6", - "@inquirer/confirm": "^3.0.0", - "@mswjs/interceptors": "^0.29.0", - "@open-draft/until": "^2.1.0", - "@types/cookie": "^0.6.0", - "@types/statuses": "^2.0.4", - "chalk": "^4.1.2", - "graphql": "^16.8.1", - "headers-polyfill": "^4.0.2", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.2", - "path-to-regexp": "^6.2.0", - "strict-event-emitter": "^0.5.1", - "type-fest": "^4.9.0", - "yargs": "^17.7.2" - }, - "bin": { - "msw": "cli/index.js" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mswjs" - }, - "peerDependencies": { - "typescript": ">= 4.7.x" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/msw/node_modules/path-to-regexp": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", - "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", - "dev": true - }, - "node_modules/msw/node_modules/type-fest": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.23.0.tgz", - "integrity": "sha512-ZiBujro2ohr5+Z/hZWHESLz3g08BBdrdLMieYFULJO+tWc437sn8kQsWLJoZErY8alNhxre9K4p3GURAG11n+w==", + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "node_modules/is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" + "dependencies": { + "call-bind": "^1.0.7" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nifti-reader-js": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", - "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "dependencies": { - "fflate": "*" + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], "engines": { - "node": ">=10.5.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.13.0" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", "dev": true }, - "node_modules/nopt": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", - "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.12.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=14.16" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", "dev": true, "dependencies": { - "boolbase": "^1.0.0" + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/numcodecs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/numcodecs/-/numcodecs-0.3.2.tgz", - "integrity": "sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==", - "license": "MIT", - "dependencies": { - "fflate": "^0.8.0" + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nwmatcher": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", - "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -10102,16 +9305,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, "engines": { "node": ">= 0.4" }, @@ -10119,27 +9322,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -10148,2577 +9350,2981 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "node_modules/is-whitespace": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", + "integrity": "sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, + "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/isomorphic-rslog": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/isomorphic-rslog/-/isomorphic-rslog-0.0.6.tgz", + "integrity": "sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==", "dev": true, - "dependencies": { - "wrappy": "1" + "license": "MIT", + "engines": { + "node": ">=14.17.6" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jackspeak": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz", + "integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=6" + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, - "bin": { - "opener": "bin/opener-bin.js" + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-beautify": { + "version": "1.14.11", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.11.tgz", + "integrity": "sha512-rPogWqAfoYh1Ryqqh2agUpVfbxAhbjuN1SmU86dskQUKouRiggUTCO4+2ym9UPXllc2WAp0J+T5qxn7Um3lCdw==", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.3", + "glob": "^10.3.3", + "nopt": "^7.2.0" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-beautify/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", - "dev": true, + "node_modules/js-beautify/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-beautify/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/js-beautify/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16 || 14 >=14.18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsdom": { + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.0.0.tgz", + "integrity": "sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==", "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", + "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "tldts": "^6.1.32" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=16" } }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "engines": { - "node": ">=12.20" - } + "optional": true, + "peer": true }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", "dev": true, + "license": "MIT" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { - "yocto-queue": "^0.1.0" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.6.0" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" } }, - "node_modules/p-retry": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", - "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", + "node_modules/jszip/node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { - "@types/retry": "0.12.2", - "is-network-error": "^1.0.0", - "retry": "^0.13.1" + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" } }, - "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", - "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" + "readable-stream": "^2.0.5" }, "engines": { - "node": ">= 14" + "node": ">= 0.6.3" } }, - "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "deprecated": "use String.prototype.padStart()" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "dependencies": { - "degenerator": "^5.0.0", - "netmask": "^2.0.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 0.8.0" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "immediate": "~3.0.5" + } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-app": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "optional": true, + "peer": true, "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "@promptbook/utils": "0.69.5", + "type-fest": "4.26.0", + "userhome": "1.0.1" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/locate-app/node_modules/type-fest": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, + "optional": true, + "peer": true, "engines": { - "node": ">=6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.zip": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", + "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", "dev": true, + "optional": true, + "peer": true + }, + "node_modules/loglevel": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">= 0.8" + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } + "optional": true, + "peer": true }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/loupe": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz", + "integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==", "dev": true, "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "node_modules/memfs": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.0.tgz", + "integrity": "sha512-q9MmZXd2rRWHS6GU3WEm3HyiXZyyoA1DqdOhEq0lxPBmKb5S7IAOwX0RgUCwJfqjelDCySa5h8ujOy24LqsWcw==", "dev": true, "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { - "node": "20 || >=22" + "node": ">= 4.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { - "node": ">= 14.16" + "node": ">= 8" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">= 0.6" } }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "find-up": "^6.3.0" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8.6" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "p-locate": "^6.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dependencies": { - "p-limit": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" - }, - "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "minimist": "^1.2.6" }, - "engines": { - "node": "^10 || ^12 || >=14" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": ">=10" } }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/msgpackr": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz", + "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==", + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" + "node-gyp-build-optional-packages": "5.2.2" }, - "engines": { - "node": "^10 || ^12 || >= 14" + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" }, - "peerDependencies": { - "postcss": "^8.1.0" + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "node_modules/msw": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.0.tgz", + "integrity": "sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==", "dev": true, + "hasInstallScript": true, "dependencies": { - "postcss-selector-parser": "^6.0.4" + "@bundled-es-modules/cookie": "^2.0.1", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.37.0", + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.26.1", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" }, "peerDependencies": { - "postcss": "^8.1.0" + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "node_modules/msw/node_modules/type-fest": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.30.0.tgz", + "integrity": "sha512-G6zXWS1dLj6eagy6sVhOMQiLtJdxQBHIA9Z6HFUNLOlr6MFOgzV8wvmidtPONfPtEUv0uZsy77XJNzTAfwPDaA==", "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=16" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", "dev": true, + "license": "MIT", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" }, - "engines": { - "node": ">=4" + "bin": { + "multicast-dns": "cli.js" } }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { - "prettier": "bin/prettier.cjs" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/pretty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", - "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", - "dependencies": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nifti-reader-js": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/nifti-reader-js/-/nifti-reader-js-0.6.8.tgz", + "integrity": "sha512-yIKNVzYFiUcSHazoR+sd6Ka7sUmZTabaVqJRFxbdlAKR1hnPBuNP71g3AyApo37nJ3k41c632QPij5q7gF1YPQ==", "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" + "fflate": "*" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "optional": true, + "peer": true, "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=10.5.0" } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { - "node": ">= 0.6.0" + "node": ">= 6.13.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, + "optional": true, + "peer": true + }, + "node_modules/nopt": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.0.tgz", + "integrity": "sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" }, "engines": { - "node": ">= 0.10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=0.10.0" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" + "node_modules/numcodecs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/numcodecs/-/numcodecs-0.3.2.tgz", + "integrity": "sha512-6YSPnmZgg0P87jnNhi3s+FVLOcIn3y+1CTIgUulA3IdASzK9fJM87sUFkpyA+be9GibGRaST2wCgkD+6U+fWKw==", + "license": "MIT", + "dependencies": { + "fflate": "^0.8.0" } }, - "node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", "dev": true, "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" }, "engines": { - "node": ">=16.3.0" + "node": ">= 6.9.0" }, "peerDependencies": { - "typescript": ">= 4.7.4" + "chokidar": "^3.3.0" }, "peerDependenciesMeta": { - "typescript": { + "chokidar": { "optional": true } } }, - "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">= 6" } }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } + "node_modules/nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==" }, - "node_modules/query-selector-shadow-dom": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", - "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "node_modules/nwsapi": { + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quote-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", - "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==", + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, "dependencies": { - "buffer-equal": "0.0.1", - "minimist": "^1.1.3", - "through2": "^2.0.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, - "bin": { - "quote-stream": "bin/cmd.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quote-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "safe-buffer": "^5.1.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true, - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "wrappy": "1" } }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { + "node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { - "minimatch": "^5.1.0" + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { - "picomatch": "^2.2.1" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": ">=8.10.0" + "node": ">= 0.8.0" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true + }, + "node_modules/oxlint": { + "version": "0.15.9", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-0.15.9.tgz", + "integrity": "sha512-h5neHC556pkfaDcFF+UIctGWfGv9oxf6aEKNv9YDriEaxuMBclHr4UY8p+Uml9flrvvdHZiiL/nq8gMJmNuC4g==", "dev": true, - "dependencies": { - "resolve": "^1.20.0" + "license": "MIT", + "bin": { + "oxc_language_server": "bin/oxc_language_server", + "oxlint": "bin/oxlint" }, "engines": { - "node": ">= 10.13.0" + "node": ">=8.*" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/darwin-arm64": "0.15.9", + "@oxlint/darwin-x64": "0.15.9", + "@oxlint/linux-arm64-gnu": "0.15.9", + "@oxlint/linux-arm64-musl": "0.15.9", + "@oxlint/linux-x64-gnu": "0.15.9", + "@oxlint/linux-x64-musl": "0.15.9", + "@oxlint/win32-arm64": "0.15.9", + "@oxlint/win32-x64": "0.15.9" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "node_modules/pac-proxy-agent": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "degenerator": "^5.0.0", + "netmask": "^2.0.2" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { - "lodash": "^4.17.19" + "callsites": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">=6" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/parse5": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "dev": true, "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" + "entities": "^4.5.0" }, - "peerDependencies": { - "request": "^2.34" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/request-promise-native/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "domhandler": "^5.0.3", + "parse5": "^7.0.0" }, - "engines": { - "node": ">=0.8" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "domelementtype": "^2.3.0" }, "engines": { - "node": ">= 0.12" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "parse5": "^7.0.0" }, - "engines": { - "node": ">=0.8" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": "20 || >=22" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/pathe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", + "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14.16" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "engines": { + "node": ">=8.6" + }, "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/playwright": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz", + "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "lowercase-keys": "^3.0.0" + "playwright-core": "1.50.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/resq": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", - "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "node_modules/playwright-core": { + "version": "1.50.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz", + "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==", "dev": true, - "dependencies": { - "fast-deep-equal": "^2.0.1" + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/resq/node_modules/fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", - "dev": true + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.12.0" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "node_modules/portfinder/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": ">= 4" + "node": "^10 || ^12 || >=14" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/rgb2hex": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", - "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "icss-utils": "^5.0.0" }, "engines": { - "node": "*" + "node": "^10 || ^12 || >= 14" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/rollup": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.19.0.tgz", - "integrity": "sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==", + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.19.0", - "@rollup/rollup-android-arm64": "4.19.0", - "@rollup/rollup-darwin-arm64": "4.19.0", - "@rollup/rollup-darwin-x64": "4.19.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.19.0", - "@rollup/rollup-linux-arm-musleabihf": "4.19.0", - "@rollup/rollup-linux-arm64-gnu": "4.19.0", - "@rollup/rollup-linux-arm64-musl": "4.19.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.19.0", - "@rollup/rollup-linux-riscv64-gnu": "4.19.0", - "@rollup/rollup-linux-s390x-gnu": "4.19.0", - "@rollup/rollup-linux-x64-gnu": "4.19.0", - "@rollup/rollup-linux-x64-musl": "4.19.0", - "@rollup/rollup-win32-arm64-msvc": "4.19.0", - "@rollup/rollup-win32-ia32-msvc": "4.19.0", - "@rollup/rollup-win32-x64-msvc": "4.19.0", - "fsevents": "~2.3.2" + "node": ">= 0.8.0" } }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">=18" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/pretty": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", + "integrity": "sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==", "dependencies": { - "queue-microtask": "^1.2.2" + "condense-newlines": "^0.2.1", + "extend-shallow": "^2.0.1", + "js-beautify": "^1.6.12" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/safaridriver": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", - "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz", - "integrity": "sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", - "is-regex": "^1.1.4" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + } }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, + "optional": true, + "peer": true, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=0.4.0" } }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 14" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "dependencies": { - "ms": "2.0.0" + "optional": true, + "peer": true, + "engines": { + "node": ">=12" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, - "node_modules/serialize-error": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", - "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "type-fest": "^2.12.2" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" } }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { - "node": ">= 0.8.0" + "node": ">=0.6" } }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ms": "2.0.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "engines": { "node": ">= 0.6" } }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" + "minimatch": "^5.1.0" } }, - "node_modules/set-function-length": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", - "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "define-data-property": "^1.1.1", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=10" } }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8.10.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, "dependencies": { - "kind-of": "^6.0.2" + "resolve": "^1.20.0" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" } }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.8.tgz", + "integrity": "sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "shebang-regex": "^3.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "dunder-proto": "^1.0.0", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.2.0", + "which-builtin-type": "^1.2.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-html-tokenizer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", - "integrity": "sha512-Mc/gH3RvlKvB/gkp9XwgDKEWrSYyefIJPGG8Jk1suZms/rISdUuVEMx5O1WBnTWaScvxXDvGJrZQWblUmQHjkQ==", - "dev": true - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "lodash": "^4.17.19" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, + "node_modules/request-promise-native/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.12" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", - "dev": true, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.8.3" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">= 14" + "node": ">=0.8" } }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spacetrim": { - "version": "0.11.36", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.36.tgz", - "integrity": "sha512-jqv5aAfMLkBnFK+38QUtEGgU7x1KrfpDnCdjX4+W1IEVgA8Kf3tk8K9je8j2nkCSXdIngjda53fuXERr4/61kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://buymeacoffee.com/hejny" - }, - { - "type": "github", - "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" - } - ] - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/resq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", + "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "fast-deep-equal": "^2.0.1" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 10.x" + "node": ">= 4" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { + "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/static-eval": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz", - "integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==", - "dependencies": { - "escodegen": "^2.1.0" - } - }, - "node_modules/static-module": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz", - "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==", - "dependencies": { - "concat-stream": "~1.6.0", - "convert-source-map": "^1.5.1", - "duplexer2": "~0.1.4", - "escodegen": "~1.9.0", - "falafel": "^2.1.0", - "has": "^1.0.1", - "magic-string": "^0.22.4", - "merge-source-map": "1.0.4", - "object-inspect": "~1.4.0", - "quote-stream": "~1.0.2", - "readable-stream": "~2.3.3", - "shallow-copy": "~0.0.1", - "static-eval": "^2.0.0", - "through2": "~2.0.3" - } - }, - "node_modules/static-module/node_modules/escodegen": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz", - "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==", + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", "dependencies": { - "esprima": "^3.1.3", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "glob": "^10.3.7" }, "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" + "rimraf": "dist/esm/bin.mjs" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/static-module/node_modules/esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/static-module/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/static-module/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/rimraf/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-module/node_modules/magic-string": { - "version": "0.22.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dependencies": { - "vlq": "^0.2.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/static-module/node_modules/object-inspect": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz", - "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==" + "node_modules/rimraf/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" }, - "node_modules/static-module/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/rimraf/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/static-module/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/rollup": { + "version": "4.34.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.2.tgz", + "integrity": "sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.34.2", + "@rollup/rollup-android-arm64": "4.34.2", + "@rollup/rollup-darwin-arm64": "4.34.2", + "@rollup/rollup-darwin-x64": "4.34.2", + "@rollup/rollup-freebsd-arm64": "4.34.2", + "@rollup/rollup-freebsd-x64": "4.34.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.2", + "@rollup/rollup-linux-arm-musleabihf": "4.34.2", + "@rollup/rollup-linux-arm64-gnu": "4.34.2", + "@rollup/rollup-linux-arm64-musl": "4.34.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.2", + "@rollup/rollup-linux-riscv64-gnu": "4.34.2", + "@rollup/rollup-linux-s390x-gnu": "4.34.2", + "@rollup/rollup-linux-x64-gnu": "4.34.2", + "@rollup/rollup-linux-x64-musl": "4.34.2", + "@rollup/rollup-win32-arm64-msvc": "4.34.2", + "@rollup/rollup-win32-ia32-msvc": "4.34.2", + "@rollup/rollup-win32-x64-msvc": "4.34.2", + "fsevents": "~2.3.2" } }, - "node_modules/static-module/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/static-module/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" + "queue-microtask": "^1.2.2" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/safaridriver": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", + "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "bl": "^5.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=v12.22.7" } }, - "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, - "optionalDependencies": { - "bare-events": "^2.2.0" + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "dev": true, + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@types/node-forge": "^1.3.0", + "node-forge": "^1" }, "engines": { - "node": ">=12" + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/serialize-error": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", + "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ansi-regex": "^6.0.1" + "type-fest": "^2.12.2" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "randombytes": "^2.1.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "ms": "2.0.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, - "engines": { - "node": ">=8" + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.4" } }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, - "peerDependencies": { - "webpack": "^5.27.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "kind-of": "^6.0.2" }, "engines": { "node": ">=8" } }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12726,1686 +12332,1963 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.2.tgz", - "integrity": "sha512-kbrcEh5n5JkypaSC152eGfGcnT4lkR0eSfvefaUJkLqgGjRQJyKDvvEE/CCv5aTSdfXuc+N98w16iAojhShI3g==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "object-assign": "^4.0.1", - "simple-html-tokenizer": "^0.1.1" - } - }, - "node_modules/svg-inline-loader/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-inline-loader/node_modules/loader-utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", - "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/table/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">= 10" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, + "optional": true, + "peer": true, "engines": { - "node": ">=6" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, + "license": "MIT", "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" } }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/terminal-link": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-3.0.0.tgz", - "integrity": "sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==", + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "ansi-escapes": "^5.0.0", - "supports-hyperlinks": "^2.2.0" + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/terser": { - "version": "5.29.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", - "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } }, - "node_modules/text-decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", - "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "node_modules/spacetrim": { + "version": "0.11.59", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", + "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "optional": true, + "peer": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, + "license": "MIT", "dependencies": { - "b4a": "^1.6.4" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.x" } }, - "node_modules/through2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "optional": true, + "peer": true }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", "dev": true }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/tinypool": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.0.tgz", - "integrity": "sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==", + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">= 0.8" } }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true }, - "node_modules/tinyspy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.0.tgz", - "integrity": "sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==", - "dev": true, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "engines": { - "node": ">=14.0.0" + "node": ">=0.10.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/streamx": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.0.tgz", + "integrity": "sha512-Qz6MsDZXJ6ur9u+b+4xCG18TluU7PGlRfXVAAjNiGsFrBUt/ioyLkxbFaKJygoPs+/kW4VyBj0bSj89Qu0IGyg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "is-number": "^7.0.0" + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" }, - "engines": { - "node": ">=8.0" + "optionalDependencies": { + "bare-events": "^2.2.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "engines": { - "node": ">=0.6" + "dependencies": { + "safe-buffer": "~5.1.0" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=16" + "node": ">=12" }, - "peerDependencies": { - "typescript": ">=4.2.0" + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "dependencies": { - "minimist": "^1.2.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "node_modules/tsx": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.2.tgz", - "integrity": "sha512-C1uWweJDgdtX2x600HjaFaucXTilT7tgUZHbOE4+ypskZ1OP8CRCSDkCxG6Vya9EwaFIVagWwpaVAn5wzypaqQ==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "esbuild": "~0.21.5", - "get-tsconfig": "^4.7.5" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, - "bin": { - "tsx": "dist/cli.mjs" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "optionalDependencies": { - "fsevents": "~2.3.3" + "engines": { + "node": ">=8" } }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "optional": true, - "os": [ - "aix" - ], "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", "dev": true, "optional": true, - "os": [ - "android" - ], + "peer": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/terser": { + "version": "5.29.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.1.tgz", + "integrity": "sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, "engines": { - "node": ">=12" + "node": ">=10" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, "engines": { - "node": ">=12" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "dev": true, "engines": { - "node": ">=12" + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/tinyglobby": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", + "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "fdir": "^6.4.2", + "picomatch": "^4.0.2" + }, "engines": { - "node": ">=12" + "node": ">=12.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/tinypool": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/tldts": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.70.tgz", + "integrity": "sha512-/W1YVgYVJd9ZDjey5NXadNh0mJXkiUMUue9Zebd0vpdo1sU+H4zFFTaJ1RKD4N6KFoHfcXy6l+Vu7bh+bdWCzA==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tldts-core": "^6.1.70" + }, + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/tldts-core": { + "version": "6.1.70", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.70.tgz", + "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8.0" } }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">=0.6" } }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "node": ">=6" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/tr46": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", + "dev": true, "dependencies": { - "safe-buffer": "^5.0.1" + "punycode": "^2.3.1" }, "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.20" + "node": ">=18.12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/ts-checker-rspack-plugin": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ts-checker-rspack-plugin/-/ts-checker-rspack-plugin-1.1.1.tgz", + "integrity": "sha512-BlpPqnfAmV0TcDg58H+1qV8Zb57ilv0x+ajjnxrVQ6BWgC8HzAdc+TycqDOJ4sZZYIV+hywQGozZFGklzbCR6A==", "dev": true, + "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "@babel/code-frame": "^7.16.7", + "@rspack/lite-tapable": "^1.0.0", + "chokidar": "^3.5.3", + "memfs": "^4.14.0", + "minimatch": "^9.0.5", + "picocolors": "^1.1.1" }, "engines": { - "node": ">= 0.6" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0", + "typescript": ">=3.8.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + } } }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" }, - "engines": { - "node": ">= 0.4" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.17" + "node": ">=18" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/unbzip2-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "optional": true, + "os": [ + "darwin" ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "engines": { + "node": ">=18" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 4.0.0" + "node": ">=18" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "optional": true, + "os": [ + "linux" ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=18" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/userhome": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", - "integrity": "sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==", + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8.0" + "node": ">=18" } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=18" } }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">=18" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/vite": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.4.tgz", - "integrity": "sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==", + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.39", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=18" } }, - "node_modules/vite-node": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.4.tgz", - "integrity": "sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==", + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.5", - "pathe": "^1.1.2", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=18" } }, - "node_modules/vite-node/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ms": "2.1.2" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "optional": true, "os": [ - "aix" + "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", "cpu": [ - "x64" + "ia32" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "win32" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], + "node_modules/typed-array-byte-offset": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=12" + "node": ">=14.17" } }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], + "node_modules/typescript-eslint": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", + "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/utils": "8.23.0" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/undici": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", "dev": true, "optional": true, - "os": [ - "linux" - ], + "peer": true, "engines": { - "node": ">=12" + "node": ">=18.17" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "qs": "^6.4.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 4.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, - "optional": true, - "os": [ - "netbsd" + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } ], - "engines": { - "node": ">=12" + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "dev": true, "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + "peer": true }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/userhome": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", + "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", "dev": true, "optional": true, - "os": [ - "sunos" - ], + "peer": true, "engines": { - "node": ">=12" + "node": ">= 0.8.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/valibot": { + "version": "1.0.0-beta.15", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.0.0-beta.15.tgz", + "integrity": "sha512-BKy8XosZkDHWmYC+cJG74LBzP++Gfntwi33pP3D3RKztz2XV9jmFWnkOi21GoqARP8wAWARwhV6eTr1JcWzjGw==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/vite": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.11.tgz", + "integrity": "sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=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 + } } }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "node_modules/vite-node": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", + "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", "dev": true, - "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.2", + "vite": "^5.0.0 || ^6.0.0" + }, "bin": { - "esbuild": "bin/esbuild" + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=12" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/vitest": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.4.tgz", - "integrity": "sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@vitest/expect": "2.0.4", - "@vitest/pretty-format": "^2.0.4", - "@vitest/runner": "2.0.4", - "@vitest/snapshot": "2.0.4", - "@vitest/spy": "2.0.4", - "@vitest/utils": "2.0.4", - "chai": "^5.1.1", - "debug": "^4.3.5", - "execa": "^8.0.1", - "magic-string": "^0.30.10", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "tinybench": "^2.8.0", - "tinypool": "^1.0.0", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.0.4", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", + "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.5", + "@vitest/mocker": "3.0.5", + "@vitest/pretty-format": "^3.0.5", + "@vitest/runner": "3.0.5", + "@vitest/snapshot": "3.0.5", + "@vitest/spy": "3.0.5", + "@vitest/utils": "3.0.5", + "chai": "^5.1.2", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.5", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.0.4", - "@vitest/ui": "2.0.4", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.5", + "@vitest/ui": "3.0.5", "happy-dom": "*", "jsdom": "*" }, @@ -14413,6 +14296,9 @@ "@edge-runtime/vm": { "optional": true }, + "@types/debug": { + "optional": true + }, "@types/node": { "optional": true }, @@ -14430,28 +14316,6 @@ } } }, - "node_modules/vitest/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==" - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -14461,11 +14325,25 @@ "browser-process-hrtime": "^1.0.0" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/wait-port": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", @@ -14483,6 +14361,8 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14496,115 +14376,157 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 8" } }, "node_modules/webdriver": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.39.0.tgz", - "integrity": "sha512-Kc3+SfiH4ufyrIht683VT2vnJocx0pfH8rYdyPvEh1b2OYewtFTHK36k9rBDHZiBmk6jcSXs4M2xeFgOuon9Lg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.4.1.tgz", + "integrity": "sha512-vFDdxMj/9W1+6jhpHSiRYfO8dix23HjAUtLx7aOv9ejEsntC0EzCIAftJ59YsF3Ppu184+FkdDVhnivpkZPTFw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "8.39.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "deepmerge-ts": "^5.1.0", - "got": "^12.6.1", - "ky": "^0.33.0", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "deepmerge-ts": "^7.0.3", + "undici": "^6.20.1", "ws": "^8.8.0" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" } }, - "node_modules/webdriverio": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.39.1.tgz", - "integrity": "sha512-dPwLgLNtP+l4vnybz+YFxxH8nBKOP7j6VVzKtfDyTLDQg9rz3U8OA4xMMQCBucnrVXy3KcKxGqlnMa+c4IfWCQ==", + "node_modules/webdriver/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.39.0", - "@wdio/logger": "8.38.0", - "@wdio/protocols": "8.38.0", - "@wdio/repl": "8.24.12", - "@wdio/types": "8.39.0", - "@wdio/utils": "8.39.0", - "archiver": "^7.0.0", - "aria-query": "^5.0.0", + "undici-types": "~6.19.2" + } + }, + "node_modules/webdriver/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/webdriverio": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.4.1.tgz", + "integrity": "sha512-XIPtRnxSES4CoxH2BfUY/6QzNgEgJEUjMYu7t7SJR8bVfbLRVXAA1ie9kM0MtdLs4oZ2Pr8rR8fqytsA1CjEWw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.11.30", + "@types/sinonjs__fake-timers": "^8.1.5", + "@wdio/config": "9.2.8", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/repl": "9.0.8", + "@wdio/types": "9.2.2", + "@wdio/utils": "9.2.8", + "archiver": "^7.0.1", + "aria-query": "^5.3.0", + "cheerio": "^1.0.0-rc.12", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1302984", - "grapheme-splitter": "^1.0.2", + "grapheme-splitter": "^1.0.4", + "htmlfy": "^0.3.0", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", "jszip": "^3.10.1", "lodash.clonedeep": "^4.5.0", "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", + "minimatch": "^9.0.3", + "query-selector-shadow-dom": "^1.0.1", + "resq": "^1.11.0", "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.39.0" + "serialize-error": "^11.0.3", + "urlpattern-polyfill": "^10.0.0", + "webdriver": "9.4.1" }, "engines": { - "node": "^16.13 || >=18" + "node": ">=18.20.0" }, "peerDependencies": { - "devtools": "^8.14.0" + "puppeteer-core": "^22.3.0" }, "peerDependenciesMeta": { - "devtools": { + "puppeteer-core": { "optional": true } } }, + "node_modules/webdriverio/node_modules/@types/node": { + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/webdriverio/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "optional": true, + "peer": true + }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -14683,97 +14605,30 @@ "node_modules/webpack-bundle-analyzer/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", - "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.1", - "@webpack-cli/info": "^2.0.2", - "@webpack-cli/serve": "^2.0.5", - "colorette": "^2.0.14", - "commander": "^10.0.1", - "cross-spawn": "^7.0.3", - "envinfo": "^7.7.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, "engines": { - "node": ">=14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=8.3.0" }, "peerDependencies": { - "webpack": "5.x.x" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "webpack-bundle-analyzer": { + "bufferutil": { "optional": true }, - "webpack-dev-server": { + "utf-8-validate": { "optional": true } } }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/webpack-dev-middleware": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.1.1.tgz", - "integrity": "sha512-NmRVq4AvRQs66dFWyDR4GsFDJggtSi2Yn38MXLk0nffgF9n/AIP4TFBg2TQKYaRAN4sHuKOTiz9BnNCENDLEVA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^4.6.0", @@ -14799,15 +14654,16 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -14819,6 +14675,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -14830,13 +14687,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -14844,7 +14703,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -14856,6 +14715,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", "dev": true, + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -14910,16 +14770,24 @@ } } }, + "node_modules/webpack-dev-server/node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -14931,6 +14799,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -14938,92 +14807,37 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webpack-dev-server/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/webpack-dev-server/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "node_modules/webpack-dev-server/node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "engines": { - "node": ">=14" + "node": ">=16.17" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -15031,7 +14845,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -15052,21 +14866,13 @@ "node": ">=18.0.0" } }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -15080,6 +14886,8 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=4.0" } @@ -15089,6 +14897,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -15098,6 +14908,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=10.13.0" } @@ -15107,6 +14919,7 @@ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -15121,31 +14934,55 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "dev": true, "dependencies": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "engines": { + "node": ">=18" + } }, "node_modules/whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "dev": true, "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" } }, "node_modules/which": { @@ -15178,17 +15015,62 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15213,21 +15095,6 @@ "node": ">=8" } }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -15333,7 +15200,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/ws": { "version": "8.18.0", @@ -15357,9 +15226,19 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "node_modules/xmldom": { "version": "0.1.31", @@ -15370,14 +15249,6 @@ "node": ">=0.1" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15387,15 +15258,6 @@ "node": ">=10" } }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -15444,13 +15306,17 @@ } }, "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", + "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/yauzl/node_modules/buffer-crc32": { @@ -15491,6 +15357,8 @@ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", @@ -15505,6 +15373,8 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -15514,6 +15384,8 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -15530,6 +15402,8 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } diff --git a/package.json b/package.json index 81747aaa2f..80b128c555 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "url": "git+https://github.com/google/neuroglancer.git" }, "engines": { - "node": ">=20.11 <21 || >=21.2" + "node": ">=22" }, "browserslist": [ "last 2 Chrome versions", @@ -16,7 +16,7 @@ "last 2 Safari versions" ], "scripts": { - "generate-code": "tsx ./config/generate_code.ts", + "generate-code": "tsx ./build_tools/generate-code.ts", "update-conditions": "tsx ./build_tools/update-conditions.ts", "prepare": "tsx ./build_tools/build-package.ts --inplace --if-not-toplevel", "prepack": "tsx ./build_tools/build-package.ts --inplace", @@ -30,65 +30,83 @@ "build-python:watch": "tsx ./build_tools/cli.ts --python build --watch", "test": "vitest --run", "test:watch": "vitest watch", + "example-project-test": "playwright test", "benchmark": "vitest bench --run", "benchmark:watch": "vitest bench", - "lint:check": "eslint .", - "lint:fix": "eslint . --fix", + "lint:check": "oxlint && eslint . --cache --format codeframe", + "lint:fix": "oxlint --fix && eslint . --cache --fix --format codeframe && prettier --cache -w -l .", "format:check": "prettier --cache . -c", "format:fix": "prettier --cache -w -l .", "typecheck": "tsc --noEmit", + "typecheck:watch": "tsc --noEmit --watch", "version": "tsx ./build_tools/after-version-change.ts" }, "devDependencies": { + "@eslint/js": "^9.19.0", + "@iodigital/vite-plugin-msw": "^2.0.0", + "@playwright/browser-chromium": "^1.50.1", + "@playwright/test": "^1.50.1", + "@rspack/cli": "^1.2.2", + "@rspack/core": "^1.2.2", "@types/codemirror": "5.60.15", "@types/gl-matrix": "^2.4.5", + "@types/http-server": "^0.12.4", + "@types/jsdom": "^21.1.7", "@types/lodash-es": "^4.17.12", - "@types/node": "^20.14.12", - "@types/yargs": "^17.0.32", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "@vitest/browser": "^2.0.4", - "@vitest/ui": "^2.0.4", + "@types/node": "^22.13.1", + "@types/nunjucks": "^3.2.6", + "@types/yargs": "^17.0.33", + "@vitest/browser": "^3.0.5", + "@vitest/ui": "^3.0.5", + "@vitest/web-worker": "^3.0.5", + "cookie": "^1.0.2", "css-loader": "^7.1.2", - "esbuild": "^0.23.0", - "esbuild-loader": "^4.2.2", - "eslint": "^8.56.0", + "esbuild": "^0.24.2", + "eslint": "^9.19.0", "eslint-formatter-codeframe": "^7.32.1", - "eslint-import-resolver-typescript": "^3.6.1", - "eslint-interactive": "^10.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-webpack-plugin": "^4.0.1", - "fork-ts-checker-webpack-plugin": "^6.5.3", - "glob": "^11.0.0", - "html-webpack-plugin": "^5.6.0", - "mini-css-extract-plugin": "^2.9.0", - "prettier": "3.3.3", - "style-loader": "^4.0.0", - "svg-inline-loader": "^0.8.2", - "tsx": "^4.16.2", - "typescript": "^5.5.4", - "vitest": "^2.0.4", - "webdriverio": "^8.39.1", - "webpack": "^5.93.0", + "eslint-import-resolver-typescript": "^3.7.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-oxlint": "^0.15.9", + "eslint-rspack-plugin": "^4.2.1", + "express": "^4.21.2", + "fzstd": "^0.1.1", + "glob": "^11.0.1", + "http-server": "^14.1.1", + "jsdom": "^26.0.0", + "msw": "^2.7.0", + "nunjucks": "^3.2.4", + "oxlint": "^0.15.9", + "playwright": "^1.50.1", + "prettier": "3.4.2", + "ts-checker-rspack-plugin": "^1.1.1", + "tsx": "^4.19.2", + "typescript": "^5.7.3", + "typescript-eslint": "^8.23.0", + "vitest": "^3.0.5", "webpack-bundle-analyzer": "^4.10.2", - "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.4", - "webpack-merge": "^6.0.1" + "webpack-merge": "^6.0.1", + "yargs": "^17.7.2", + "yauzl": "^3.2.0" }, "dependencies": { "codemirror": "^5.61.1", + "core-js": "^3.40.0", + "crc-32": "^1.2.2", "gl-matrix": "3.1.0", - "glsl-editor": "^1.0.0", "ikonate": "github:mikolajdobrucki/ikonate#a86b4107c6ec717e7877f880a930d1ccf0b59d89", "lodash-es": "^4.17.21", + "msgpackr": "^1.11.2", "nifti-reader-js": "^0.6.8", - "numcodecs": "^0.3.2" + "numcodecs": "^0.3.2", + "valibot": "^1.0.0-beta.15" }, "overrides": { "@puppeteer/browsers": ">=2" }, "files": [ - "lib/**/*" + "src/**/*", + "typings/**/*", + "tsconfig.json" ], "private": true, "type": "module", @@ -99,288 +117,411 @@ }, "imports": { "#src/third_party/jpgjs/jpg.js": "./src/third_party/jpgjs/jpg.js", + "#src/async_computation/decode_zstd.js": { + "node": "./src/async_computation/decode_zstd_node.ts", + "default": "./src/async_computation/decode_zstd.ts" + }, "#src/*.js": "./src/*.ts", "#src/*": "./src/*", + "#tests/fixtures/msw": { + "node": "./tests/fixtures/msw_node.ts", + "default": "./tests/fixtures/msw_browser.ts" + }, + "#tests/fixtures/gl": { + "node": "./tests/fixtures/gl_node.ts", + "default": "./tests/fixtures/gl_browser.ts" + }, + "#tests/*.js": "./tests/*.ts", "#testdata/*": "./testdata/*", "#datasource/boss/backend": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/backend.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/backend.ts" }, "#datasource/boss/async_computation": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/async_computation.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/async_computation.ts" }, "#datasource/boss/register_default": { "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_default.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/register_default.ts" }, "#datasource/boss/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/boss:enabled": "./src/datasource/boss/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/boss:disabled": "./src/datasource/boss/register_credentials_provider.ts", + "neuroglancer/datasource/boss:disabled": "./src/util/false.ts", "default": "./src/datasource/boss/register_credentials_provider.ts" }, "#datasource/brainmaps/backend": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/backend.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/backend.ts" }, "#datasource/brainmaps/async_computation": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/async_computation.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/async_computation.ts" }, "#datasource/brainmaps/register_default": { "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_default.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/register_default.ts" }, "#datasource/brainmaps/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/brainmaps:enabled": "./src/datasource/brainmaps/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/brainmaps:disabled": "./src/datasource/brainmaps/register_credentials_provider.ts", + "neuroglancer/datasource/brainmaps:disabled": "./src/util/false.ts", "default": "./src/datasource/brainmaps/register_credentials_provider.ts" }, "#datasource/deepzoom/backend": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/backend.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/backend.ts" }, "#datasource/deepzoom/async_computation": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/async_computation.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/async_computation.ts" }, "#datasource/deepzoom/register_default": { "neuroglancer/datasource/deepzoom:enabled": "./src/datasource/deepzoom/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/deepzoom:disabled": "./src/datasource/deepzoom/register_default.ts", + "neuroglancer/datasource/deepzoom:disabled": "./src/util/false.ts", "default": "./src/datasource/deepzoom/register_default.ts" }, "#datasource/dvid/backend": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/backend.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/backend.ts" }, "#datasource/dvid/async_computation": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/async_computation.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/async_computation.ts" }, "#datasource/dvid/register_default": { "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_default.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/register_default.ts" }, "#datasource/dvid/register_credentials_provider": { "neuroglancer/python": "./src/util/false.ts", "neuroglancer/datasource/dvid:enabled": "./src/datasource/dvid/register_credentials_provider.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/dvid:disabled": "./src/datasource/dvid/register_credentials_provider.ts", + "neuroglancer/datasource/dvid:disabled": "./src/util/false.ts", "default": "./src/datasource/dvid/register_credentials_provider.ts" }, "#datasource/graphene/backend": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/backend.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/backend.ts" }, "#datasource/graphene/async_computation": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/async_computation.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/async_computation.ts" }, "#datasource/graphene/register_default": { "neuroglancer/datasource/graphene:enabled": "./src/datasource/graphene/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/graphene:disabled": "./src/datasource/graphene/register_default.ts", + "neuroglancer/datasource/graphene:disabled": "./src/util/false.ts", "default": "./src/datasource/graphene/register_default.ts" }, - "#datasource/middleauth/register_credentials_provider": { - "neuroglancer/python": "./src/util/false.ts", - "neuroglancer/datasource/middleauth:enabled": "./src/datasource/middleauth/register_credentials_provider.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/middleauth:disabled": "./src/datasource/middleauth/register_credentials_provider.ts", - "default": "./src/datasource/middleauth/register_credentials_provider.ts" - }, "#datasource/n5/backend": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/backend.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/backend.ts" }, "#datasource/n5/async_computation": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/async_computation.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/async_computation.ts" }, "#datasource/n5/register_default": { "neuroglancer/datasource/n5:enabled": "./src/datasource/n5/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/n5:disabled": "./src/datasource/n5/register_default.ts", + "neuroglancer/datasource/n5:disabled": "./src/util/false.ts", "default": "./src/datasource/n5/register_default.ts" }, - "#datasource/ngauth/register_credentials_provider": { - "neuroglancer/python": "./src/util/false.ts", - "neuroglancer/datasource/ngauth:enabled": "./src/datasource/ngauth/register_credentials_provider.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/ngauth:disabled": "./src/datasource/ngauth/register_credentials_provider.ts", - "default": "./src/datasource/ngauth/register_credentials_provider.ts" - }, - "#datasource/nggraph/backend": { - "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/backend.ts", - "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/backend.ts", - "default": "./src/datasource/nggraph/backend.ts" - }, "#datasource/nggraph/register_default": { "neuroglancer/datasource/nggraph:enabled": "./src/datasource/nggraph/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nggraph:disabled": "./src/datasource/nggraph/register_default.ts", + "neuroglancer/datasource/nggraph:disabled": "./src/util/false.ts", "default": "./src/datasource/nggraph/register_default.ts" }, "#datasource/nifti/backend": { "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/backend.ts", + "neuroglancer/datasource/nifti:disabled": "./src/util/false.ts", "default": "./src/datasource/nifti/backend.ts" }, "#datasource/nifti/register_default": { "neuroglancer/datasource/nifti:enabled": "./src/datasource/nifti/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/nifti:disabled": "./src/datasource/nifti/register_default.ts", + "neuroglancer/datasource/nifti:disabled": "./src/util/false.ts", "default": "./src/datasource/nifti/register_default.ts" }, "#datasource/obj/backend": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/backend.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/backend.ts" }, "#datasource/obj/async_computation": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/async_computation.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/async_computation.ts" }, "#datasource/obj/register_default": { "neuroglancer/datasource/obj:enabled": "./src/datasource/obj/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/obj:disabled": "./src/datasource/obj/register_default.ts", + "neuroglancer/datasource/obj:disabled": "./src/util/false.ts", "default": "./src/datasource/obj/register_default.ts" }, "#datasource/precomputed/backend": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/backend.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/backend.ts" }, "#datasource/precomputed/async_computation": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/async_computation.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/async_computation.ts" }, "#datasource/precomputed/register_default": { "neuroglancer/datasource/precomputed:enabled": "./src/datasource/precomputed/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/precomputed:disabled": "./src/datasource/precomputed/register_default.ts", + "neuroglancer/datasource/precomputed:disabled": "./src/util/false.ts", "default": "./src/datasource/precomputed/register_default.ts" }, "#datasource/python/backend": { "neuroglancer/python": "./src/datasource/python/backend.ts", "default": "./src/util/false.ts" }, + "#datasource/python/register_default": { + "neuroglancer/python": "./src/datasource/python/register_default.ts", + "default": "./src/util/false.ts" + }, "#datasource/render/backend": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/backend.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/backend.ts" }, "#datasource/render/async_computation": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/async_computation.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/async_computation.ts" }, "#datasource/render/register_default": { "neuroglancer/datasource/render:enabled": "./src/datasource/render/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/render:disabled": "./src/datasource/render/register_default.ts", + "neuroglancer/datasource/render:disabled": "./src/util/false.ts", "default": "./src/datasource/render/register_default.ts" }, "#datasource/vtk/backend": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/backend.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/backend.ts" }, "#datasource/vtk/async_computation": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/async_computation.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/async_computation.ts" }, "#datasource/vtk/register_default": { "neuroglancer/datasource/vtk:enabled": "./src/datasource/vtk/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/vtk:disabled": "./src/datasource/vtk/register_default.ts", + "neuroglancer/datasource/vtk:disabled": "./src/util/false.ts", "default": "./src/datasource/vtk/register_default.ts" }, "#datasource/zarr/backend": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/backend.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/backend.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/backend.ts" }, "#datasource/zarr/async_computation": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/async_computation.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/async_computation.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/async_computation.ts" }, "#datasource/zarr/register_default": { "neuroglancer/datasource/zarr:enabled": "./src/datasource/zarr/register_default.ts", "neuroglancer/datasource:none_by_default": "./src/util/false.ts", - "neuroglancer/datasource/zarr:disabled": "./src/datasource/zarr/register_default.ts", + "neuroglancer/datasource/zarr:disabled": "./src/util/false.ts", "default": "./src/datasource/zarr/register_default.ts" }, + "#kvstore/byte_range/register": { + "neuroglancer/kvstore/byte_range:enabled": "./src/kvstore/byte_range/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/byte_range:disabled": "./src/util/false.ts", + "default": "./src/kvstore/byte_range/register.ts" + }, + "#kvstore/gcs/register": { + "neuroglancer/kvstore/gcs:enabled": "./src/kvstore/gcs/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/gcs:disabled": "./src/util/false.ts", + "default": "./src/kvstore/gcs/register.ts" + }, + "#kvstore/gzip/register": { + "neuroglancer/kvstore/gzip:enabled": "./src/kvstore/gzip/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/gzip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/gzip/register.ts" + }, + "#kvstore/http/register_frontend": { + "neuroglancer/kvstore/http:enabled": "./src/kvstore/http/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/http:disabled": "./src/util/false.ts", + "default": "./src/kvstore/http/register_frontend.ts" + }, + "#kvstore/http/register_backend": { + "neuroglancer/kvstore/http:enabled": "./src/kvstore/http/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/http:disabled": "./src/util/false.ts", + "default": "./src/kvstore/http/register_backend.ts" + }, + "#kvstore/icechunk/async_computation": { + "neuroglancer/kvstore/icechunk:enabled": "./src/kvstore/icechunk/async_computation.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/icechunk:disabled": "./src/util/false.ts", + "default": "./src/kvstore/icechunk/async_computation.ts" + }, + "#kvstore/icechunk/register_frontend": { + "neuroglancer/kvstore/icechunk:enabled": "./src/kvstore/icechunk/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/icechunk:disabled": "./src/util/false.ts", + "default": "./src/kvstore/icechunk/register_frontend.ts" + }, + "#kvstore/icechunk/register_backend": { + "neuroglancer/kvstore/icechunk:enabled": "./src/kvstore/icechunk/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/icechunk:disabled": "./src/util/false.ts", + "default": "./src/kvstore/icechunk/register_backend.ts" + }, + "#kvstore/middleauth/register_frontend": { + "neuroglancer/kvstore/middleauth:enabled": "./src/kvstore/middleauth/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/middleauth/register_frontend.ts" + }, + "#kvstore/middleauth/register_backend": { + "neuroglancer/kvstore/middleauth:enabled": "./src/kvstore/middleauth/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/middleauth/register_backend.ts" + }, + "#kvstore/middleauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:enabled": "./src/kvstore/middleauth/register_credentials_provider.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/middleauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/middleauth/register_credentials_provider.ts" + }, + "#kvstore/ngauth/register": { + "neuroglancer/kvstore/ngauth:enabled": "./src/kvstore/ngauth/register.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ngauth/register.ts" + }, + "#kvstore/ngauth/register_credentials_provider": { + "neuroglancer/python": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:enabled": "./src/kvstore/ngauth/register_credentials_provider.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ngauth:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ngauth/register_credentials_provider.ts" + }, + "#kvstore/ocdbt/async_computation": { + "neuroglancer/kvstore/ocdbt:enabled": "./src/kvstore/ocdbt/async_computation.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ocdbt:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ocdbt/async_computation.ts" + }, + "#kvstore/ocdbt/register_frontend": { + "neuroglancer/kvstore/ocdbt:enabled": "./src/kvstore/ocdbt/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ocdbt:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ocdbt/register_frontend.ts" + }, + "#kvstore/ocdbt/register_backend": { + "neuroglancer/kvstore/ocdbt:enabled": "./src/kvstore/ocdbt/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/ocdbt:disabled": "./src/util/false.ts", + "default": "./src/kvstore/ocdbt/register_backend.ts" + }, + "#kvstore/s3/register_frontend": { + "neuroglancer/kvstore/s3:enabled": "./src/kvstore/s3/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/s3:disabled": "./src/util/false.ts", + "default": "./src/kvstore/s3/register_frontend.ts" + }, + "#kvstore/s3/register_backend": { + "neuroglancer/kvstore/s3:enabled": "./src/kvstore/s3/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/s3:disabled": "./src/util/false.ts", + "default": "./src/kvstore/s3/register_backend.ts" + }, + "#kvstore/zip/register_frontend": { + "neuroglancer/kvstore/zip:enabled": "./src/kvstore/zip/register_frontend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/zip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/zip/register_frontend.ts" + }, + "#kvstore/zip/register_backend": { + "neuroglancer/kvstore/zip:enabled": "./src/kvstore/zip/register_backend.ts", + "neuroglancer/kvstore:none_by_default": "./src/util/false.ts", + "neuroglancer/kvstore/zip:disabled": "./src/util/false.ts", + "default": "./src/kvstore/zip/register_backend.ts" + }, "#layer/annotation": { "neuroglancer/layer/annotation:enabled": "./src/layer/annotation/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/annotation:disabled": "./src/util/false.ts", "default": "./src/layer/annotation/index.ts" }, "#layer/image": { "neuroglancer/layer/image:enabled": "./src/layer/image/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/image:disabled": "./src/util/false.ts", "default": "./src/layer/image/index.ts" }, "#layer/segmentation": { "neuroglancer/layer/segmentation:enabled": "./src/layer/segmentation/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/segmentation:disabled": "./src/util/false.ts", "default": "./src/layer/segmentation/index.ts" }, "#layer/single_mesh": { "neuroglancer/layer/single_mesh:enabled": "./src/layer/single_mesh/index.ts", "neuroglancer/layer:none_by_default": "./src/util/false.ts", + "neuroglancer/layer/single_mesh:disabled": "./src/util/false.ts", "default": "./src/layer/single_mesh/index.ts" }, "#main": { diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000000..fd598f38ae --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { defineConfig } from "@playwright/test"; +import exampleProjectTestConfig from "#tests/example_project_test/config.js"; + +export default defineConfig({ + projects: exampleProjectTestConfig.projects, +}); diff --git a/pyproject.toml b/pyproject.toml index 3474d58d80..c78059e51e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,7 @@ exclude = [ "/guide_video_recorder/", "^docs/", "^build/", + "^testdata/", ] [[tool.mypy.overrides]] diff --git a/python/neuroglancer/boss_credentials.py b/python/neuroglancer/boss_credentials.py index 8bbd5f1009..31e04de856 100644 --- a/python/neuroglancer/boss_credentials.py +++ b/python/neuroglancer/boss_credentials.py @@ -34,7 +34,7 @@ def func(): if os.path.isfile(os.path.expanduser(config_path)): with open(os.path.expanduser(config_path)) as config_file_handle: config_parser = ConfigParser() - config_parser.readfp(config_file_handle) + config_parser.read_file(config_file_handle) # Try Default section first try: self._credentials = config_parser["Default"]["token"] diff --git a/python/neuroglancer/coordinate_space.py b/python/neuroglancer/coordinate_space.py index 26c361a44c..4e14c42546 100644 --- a/python/neuroglancer/coordinate_space.py +++ b/python/neuroglancer/coordinate_space.py @@ -237,6 +237,7 @@ def __init__( names_tuple = tuple(names) rank = len(names_tuple) self.names = names_tuple + scales_array: np.typing.NDArray[np.float64] if scales is None: scales_array = np.ones(rank, dtype=np.float64) else: diff --git a/python/neuroglancer/server.py b/python/neuroglancer/server.py index f3408f6e36..11e7ea47d7 100644 --- a/python/neuroglancer/server.py +++ b/python/neuroglancer/server.py @@ -538,6 +538,8 @@ def set_dev_server_content_source(): "dev-server-python", "--", "--port=0", + "--no-lint", + "--no-typecheck", ], cwd=root_dir, stdin=subprocess.PIPE, diff --git a/python/neuroglancer/tool/screenshot.py b/python/neuroglancer/tool/screenshot.py index 2b39975226..01288f92cb 100755 --- a/python/neuroglancer/tool/screenshot.py +++ b/python/neuroglancer/tool/screenshot.py @@ -596,6 +596,11 @@ def define_state_modification_args(ap: argparse.ArgumentParser): type=float, help="Multiply projection view scale by specified factor.", ) + ap.add_argument( + "--resolution-scale-factor", + type=float, + help="Divide cross section view scale by specified factor. E.g. a 2000x2000 output with a resolution scale factor of 2 will have the same FOV as a 1000x1000 output.", + ) ap.add_argument( "--system-memory-limit", type=int, @@ -635,6 +640,8 @@ def apply_state_modifications( state.show_default_annotations = args.show_default_annotations if args.projection_scale_multiplier is not None: state.projection_scale *= args.projection_scale_multiplier + if args.resolution_scale_factor is not None: + state.cross_section_scale /= args.resolution_scale_factor if args.cross_section_background_color is not None: state.cross_section_background_color = args.cross_section_background_color diff --git a/python/neuroglancer/viewer_config_state.py b/python/neuroglancer/viewer_config_state.py index 27bb04d596..192b8dfdea 100644 --- a/python/neuroglancer/viewer_config_state.py +++ b/python/neuroglancer/viewer_config_state.py @@ -97,6 +97,34 @@ class LayerSelectedValues(_LayerSelectedValuesBase): """Specifies the data values associated with the current mouse position.""" +@export +class PanelResolutionData(JsonObjectWrapper): + __slots__ = () + type = wrapped_property("type", str) + width = wrapped_property("width", int) + height = wrapped_property("height", int) + resolution = wrapped_property("resolution", str) + + +@export +class LayerResolutionData(JsonObjectWrapper): + __slots__ = () + name = wrapped_property("name", str) + type = wrapped_property("type", str) + resolution = wrapped_property("resolution", str) + + +@export +class ScreenshotResolutionMetadata(JsonObjectWrapper): + __slots__ = () + panel_resolution_data = panelResolutionData = wrapped_property( + "panelResolutionData", typed_list(PanelResolutionData) + ) + layer_resolution_data = layerResolutionData = wrapped_property( + "layerResolutionData", typed_list(LayerResolutionData) + ) + + @export class ScreenshotReply(JsonObjectWrapper): __slots__ = () @@ -106,6 +134,9 @@ class ScreenshotReply(JsonObjectWrapper): height = wrapped_property("height", int) image_type = imageType = wrapped_property("imageType", str) depth_data = depthData = wrapped_property("depthData", optional(base64.b64decode)) + resolution_metadata = resolutionMetadata = wrapped_property( + "resolutionMetadata", ScreenshotResolutionMetadata + ) @property def image_pixels(self): @@ -334,6 +365,9 @@ class ConfigState(JsonObjectWrapper): show_layer_side_panel_button = showLayerSidePanelButton = wrapped_property( "showLayerSidePanelButton", optional(bool, True) ) + show_tool_palette_button = showToolPaletteButton = wrapped_property( + "showToolPaletteButton", optional(bool, True) + ) show_layer_list_panel_button = showLayerListPanelButton = wrapped_property( "showLayerListPanelButton", optional(bool, True) ) diff --git a/python/neuroglancer/viewer_state.py b/python/neuroglancer/viewer_state.py index 723edb993e..941a89c0b7 100644 --- a/python/neuroglancer/viewer_state.py +++ b/python/neuroglancer/viewer_state.py @@ -152,6 +152,17 @@ def export_tool(tool_class): return tool_class +@export +class LayerTool(Tool): + __slots__ = () + + layer = wrapped_property("layer", optional(str)) + """Name of the layer to which this tool applies. + + Only valid for tools contained within `~ToolPalette.tools`. + """ + + @export_tool class PlacePointTool(Tool): __slots__ = () @@ -177,164 +188,164 @@ class PlaceEllipsoidTool(Tool): @export_tool -class BlendTool(Tool): +class BlendTool(LayerTool): __slots__ = () TOOL_TYPE = "blend" @export_tool -class OpacityTool(Tool): +class OpacityTool(LayerTool): __slots__ = () TOOL_TYPE = "opacity" @export_tool -class VolumeRenderingTool(Tool): +class VolumeRenderingTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRendering" @export_tool -class VolumeRenderingGainTool(Tool): +class VolumeRenderingGainTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRenderingGain" @export_tool -class VolumeRenderingDepthSamplesTool(Tool): +class VolumeRenderingDepthSamplesTool(LayerTool): __slots__ = () TOOL_TYPE = "volumeRenderingDepthSamples" @export_tool -class CrossSectionRenderScaleTool(Tool): +class CrossSectionRenderScaleTool(LayerTool): __slots__ = () TOOL_TYPE = "crossSectionRenderScale" @export_tool -class SelectedAlphaTool(Tool): +class SelectedAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "selectedAlpha" @export_tool -class NotSelectedAlphaTool(Tool): +class NotSelectedAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "notSelectedAlpha" @export_tool -class ObjectAlphaTool(Tool): +class ObjectAlphaTool(LayerTool): __slots__ = () TOOL_TYPE = "objectAlpha" @export_tool -class HideSegmentZeroTool(Tool): +class HideSegmentZeroTool(LayerTool): __slots__ = () TOOL_TYPE = "hideSegmentZero" @export_tool -class HoverHighlightTool(Tool): +class HoverHighlightTool(LayerTool): __slots__ = () TOOL_TYPE = "hoverHighlight" @export_tool -class BaseSegmentColoringTool(Tool): +class BaseSegmentColoringTool(LayerTool): __slots__ = () TOOL_TYPE = "baseSegmentColoring" @export_tool -class IgnoreNullVisibleSetTool(Tool): +class IgnoreNullVisibleSetTool(LayerTool): __slots__ = () TOOL_TYPE = "ignoreNullVisibleSet" @export_tool -class ColorSeedTool(Tool): +class ColorSeedTool(LayerTool): __slots__ = () TOOL_TYPE = "colorSeed" @export_tool -class SegmentDefaultColorTool(Tool): +class SegmentDefaultColorTool(LayerTool): __slots__ = () TOOL_TYPE = "segmentDefaultColor" @export_tool -class MeshRenderScaleTool(Tool): +class MeshRenderScaleTool(LayerTool): __slots__ = () TOOL_TYPE = "meshRenderScale" @export_tool -class MeshSilhouetteRenderingTool(Tool): +class MeshSilhouetteRenderingTool(LayerTool): __slots__ = () TOOL_TYPE = "meshSilhouetteRendering" @export_tool -class SaturationTool(Tool): +class SaturationTool(LayerTool): __slots__ = () TOOL_TYPE = "saturation" @export_tool -class SkeletonRenderingMode2dTool(Tool): +class SkeletonRenderingMode2dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.mode2d" @export_tool -class SkeletonRenderingMode3dTool(Tool): +class SkeletonRenderingMode3dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.mode3d" @export_tool -class SkeletonRenderingLineWidth2dTool(Tool): +class SkeletonRenderingLineWidth2dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.lineWidth2d" @export_tool -class SkeletonRenderingLineWidth3dTool(Tool): +class SkeletonRenderingLineWidth3dTool(LayerTool): __slots__ = () TOOL_TYPE = "skeletonRendering.lineWidth3d" @export_tool -class ShaderControlTool(Tool): +class ShaderControlTool(LayerTool): __slots__ = () TOOL_TYPE = "shaderControl" control = wrapped_property("control", str) @export_tool -class MergeSegmentsTool(Tool): +class MergeSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "mergeSegments" @export_tool -class SplitSegmentsTool(Tool): +class SplitSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "splitSegments" @export_tool -class SelectSegmentsTool(Tool): +class SelectSegmentsTool(LayerTool): __slots__ = () TOOL_TYPE = "selectSegments" @export_tool -class DimensionTool(Tool): +class DimensionTool(LayerTool): __slots__ = () TOOL_TYPE = "dimension" dimension = wrapped_property("dimension", str) @@ -342,6 +353,7 @@ class DimensionTool(Tool): @export class SidePanelLocation(JsonObjectWrapper): + __slots__ = () side = wrapped_property("side", optional(str)) visible = wrapped_property("visible", optional(bool)) size = wrapped_property("size", optional(int)) @@ -350,8 +362,16 @@ class SidePanelLocation(JsonObjectWrapper): col = wrapped_property("col", optional(int)) +@export +class ToolPalette(SidePanelLocation): + __slots__ = () + tools = wrapped_property("tools", typed_list(Tool)) + query = wrapped_property("query", optional(str)) + + @export class SelectedLayerState(SidePanelLocation): + __slots__ = () layer = wrapped_property("layer", optional(str)) @@ -1579,7 +1599,7 @@ def wrapper(x, _readonly=False): data_panel_layout_types = frozenset( - ["xy", "yz", "xz", "xy-3d", "yz-3d", "xz-3d", "4panel", "3d"] + ["xy", "yz", "xz", "xy-3d", "yz-3d", "xz-3d", "4panel", "4panel-alt", "3d"] ) @@ -1827,6 +1847,9 @@ class ViewerState(JsonObjectWrapper): tool_bindings = toolBindings = wrapped_property( "toolBindings", typed_map(key_type=str, value_type=Tool) ) + tool_palettes = toolPalettes = wrapped_property( + "toolPalettes", typed_map(key_type=str, value_type=ToolPalette) + ) @staticmethod def interpolate(a, b, t): diff --git a/python/neuroglancer/webdriver.py b/python/neuroglancer/webdriver.py index ed93f73f75..83b5255bd5 100644 --- a/python/neuroglancer/webdriver.py +++ b/python/neuroglancer/webdriver.py @@ -35,6 +35,7 @@ def __init__( self, headless=True, browser="chrome", + browser_binary_path: Optional[str] = None, window_size=(1920, 1080), debug=False, docker=False, @@ -50,6 +51,7 @@ def __init__( list(extra_command_line_args) if extra_command_line_args else [] ) self.debug = debug + self.browser_binary_path = browser_binary_path self._log_listeners_lock = threading.Lock() self._log_listeners: dict[LogListener, None] = {} @@ -70,6 +72,8 @@ def _init_chrome(self): if self.headless: chrome_options.add_argument("--headless=new") chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) + if self.browser_binary_path: + chrome_options.binary_location = self.browser_binary_path if self.docker: # https://www.intricatecloud.io/2019/05/running-webdriverio-tests-using-headless-chrome-inside-a-container/ chrome_options.add_argument("--no-sandbox") @@ -90,6 +94,8 @@ def _init_firefox(self): if self.headless: options.add_argument("--headless") options.arguments.extend(self.extra_command_line_args) + if self.browser_binary_path: + options.binary_location = self.browser_binary_path self.driver = selenium.webdriver.Firefox( options=options, ) diff --git a/python/neuroglancer/write_annotations.py b/python/neuroglancer/write_annotations.py index 272cd80cf6..8a204e0fc1 100644 --- a/python/neuroglancer/write_annotations.py +++ b/python/neuroglancer/write_annotations.py @@ -82,6 +82,8 @@ def _get_dtype_for_properties( class AnnotationWriter: annotations: list[Annotation] related_annotations: list[dict[int, list[Annotation]]] + lower_bound: np.typing.NDArray[np.float64] + upper_bound: np.typing.NDArray[np.float64] def __init__( self, @@ -172,11 +174,11 @@ def _add_two_point_obj( def _add_obj(self, coords: Sequence[float], id: Optional[int], **kwargs): encoded = np.zeros(shape=(), dtype=self.dtype) - encoded[()]["geometry"] = coords + encoded[()]["geometry"] = coords # type: ignore[call-overload] for i, p in enumerate(self.properties): if p.id in kwargs: - encoded[()][f"property{i}"] = kwargs.pop(p.id) + encoded[()][f"property{i}"] = kwargs.pop(p.id) # type: ignore[call-overload] related_ids = [] for relationship in self.relationships: diff --git a/python/tests/client_test.py b/python/tests/client_test.py deleted file mode 100644 index 50f45ce3d4..0000000000 --- a/python/tests/client_test.py +++ /dev/null @@ -1,333 +0,0 @@ -"""Tests that screenshots of the example projects match neuroglancer itself. - -This validates that the example project configurations are correct. -""" - -import base64 -import concurrent.futures -import hashlib -import io -import json -import os -import pickle -import re -import signal -import subprocess -import sys -import threading -import time - -import filelock -import neuroglancer.static_file_server -import neuroglancer.webdriver -import numpy as np -import PIL.Image -import pytest -import pytest_html # type: ignore[import-untyped,import] - -root_dir = os.path.join(os.path.dirname(__file__), "..", "..") -examples_dir = os.path.join(os.path.dirname(__file__), "..", "..", "examples") - - -def capture_screenshot_from_dev_server( - webdriver, example_dir, test_fragment, extra_args=None -): - if sys.platform == "win32": - process_group_args = dict(creationflags=subprocess.CREATE_NEW_PROCESS_GROUP) - else: - # Technically, it would be better to use just a new process group rather - # than a new session, as we would like the subprocesses to still be - # considered part of the same session. However, the parcel dev server - # causes this test to hang when using a new process group rather than a - # new session. - process_group_args = dict(start_new_session=True) - p = subprocess.Popen( - ["npm", "run", "dev-server", "--"] + (extra_args or []), - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - cwd=example_dir, - encoding="utf-8", - **process_group_args, - ) - - try: - future = concurrent.futures.Future() - - def thread_func(f): - url = None - for line in f: - print(f"[dev-server] {line.rstrip()}") - if url is None: - m = re.search(r"http://[^,\s]+", line) - if m is not None: - url = m.group(0) - future.set_result(url) - if url is None: - future.set_result(None) - - thread = threading.Thread(target=thread_func, args=(p.stdout,)) - thread.start() - - print("waiting for url") - while True: - try: - url = future.result(timeout=1) - break - except concurrent.futures.TimeoutError: - continue - print(f"got url: {url}") - - assert url is not None - - return capture_screenshot(webdriver, url, test_fragment) - finally: - if sys.platform == "win32": - p.send_signal(signal.CTRL_BREAK_EVENT) - else: - os.killpg(os.getpgid(p.pid), signal.SIGTERM) - try: - p.wait(timeout=2) - except subprocess.TimeoutExpired: - p.kill() - p.wait() - - -def capture_screenshot_from_build( - webdriver, - example_dir, - test_fragment, - output_dir=None, - extra_args=None, -): - subprocess.run( - ["npm", "run", "build", "--"] + (extra_args or []), cwd=example_dir, check=True - ) - if output_dir is None: - output_dir = os.path.join(example_dir, "dist") - - with neuroglancer.static_file_server.StaticFileServer(output_dir) as url: - return capture_screenshot(webdriver, f"{url}/index.html", test_fragment) - - -def capture_screenshot(webdriver, url, test_fragment): - test_url = url + test_fragment - - original_window_handle = webdriver.driver.current_window_handle - # Use a separate tab for each capture. This avoids hitting the limit on - # number of WebAssembly memories due to the Chrome back/forward cache. - webdriver.driver.switch_to.new_window("tab") - try: - webdriver.driver.get(test_url) - print("Capturing screenshot") - while True: - # When using `vite`, the page may reload automatically due to vite's - # lazy "optimizing dependencies". - if webdriver.driver.execute_script( - "return typeof viewer !== 'undefined' && viewer.isReady();" - ): - break - time.sleep(0.1) - - # Wait for chunk statistics to update - time.sleep(0.5) - - return webdriver.driver.get_screenshot_as_png() - finally: - # Close previously-opened tab - webdriver.driver.close() - webdriver.driver.switch_to.window(original_window_handle) - - -TEST_FRAGMENT = "#!%7B%22dimensions%22:%7B%22x%22:%5B8e-9%2C%22m%22%5D%2C%22y%22:%5B8e-9%2C%22m%22%5D%2C%22z%22:%5B8e-9%2C%22m%22%5D%7D%2C%22position%22:%5B22316.904296875%2C21921.87890625%2C24029.763671875%5D%2C%22crossSectionScale%22:1%2C%22crossSectionDepth%22:-37.62185354999912%2C%22projectionOrientation%22:%5B-0.1470303237438202%2C0.5691322684288025%2C0.19562694430351257%2C0.7849844694137573%5D%2C%22projectionScale%22:118020.30607575581%2C%22layers%22:%5B%7B%22type%22:%22image%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/emdata/clahe_yz/jpeg%22%2C%22tab%22:%22source%22%2C%22name%22:%22emdata%22%7D%2C%7B%22type%22:%22segmentation%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/v1.0/segmentation%22%2C%22tab%22:%22segments%22%2C%22segments%22:%5B%221944507292%22%5D%2C%22name%22:%22segmentation%22%7D%5D%2C%22showSlices%22:false%2C%22selectedLayer%22:%7B%22layer%22:%22segmentation%22%7D%2C%22layout%22:%22xy-3d%22%7D" - - -@pytest.fixture(scope="session") -def expected_screenshot(request, webdriver_generic): - return get_xdist_session_value( - lambda: capture_screenshot_from_dev_server( - webdriver=webdriver_generic, - example_dir=root_dir, - test_fragment=TEST_FRAGMENT, - extra_args=["--no-typecheck", "--no-lint"], - ), - request, - ) - - -EXAMPLE_DIRS = [ - f"examples/{bundler}/{bundler}-project-{package}" - for bundler in [ - "vite", - # Disable parcel since it currently has "failed to resolve bundle" errors. - # "parcel", - "webpack", - ] - for package in ["source", "built"] -] - - -# https://pytest-xdist.readthedocs.io/en/latest/how-to.html#making-session-scoped-fixtures-execute-only-once -def get_xdist_session_value(getter, request, *args, **kwargs): - print(request.node.name) - worker_id = request.getfixturevalue("worker_id") - if worker_id == "master": - # Not executing with multiple workers - return getter() - - root_tmp_dir = request.getfixturevalue("tmp_path_factory").getbasetemp().parent - temp_path = ( - root_tmp_dir - / hashlib.sha256( - json.dumps([request.fixturename, args, kwargs]).encode("utf-8") - ).hexdigest() - ) - with filelock.FileLock(str(temp_path) + ".lock"): - if temp_path.is_file(): - return pickle.loads(temp_path.read_bytes()) - data = getter() - temp_path.write_bytes(pickle.dumps(data)) - return data - - -@pytest.fixture(scope="session", params=EXAMPLE_DIRS) -def example_dir(request): - return request.param - - -@pytest.fixture(scope="session") -def built_package(request): - def do_build(): - subprocess.run( - ["npm", "install", "--no-fund", "--no-audit"], cwd=root_dir, check=True - ) - subprocess.run(["npm", "run", "build-package"], cwd=root_dir, check=True) - - get_xdist_session_value( - do_build, - request, - ) - - -@pytest.fixture(scope="session") -def installed_example_dir(request, example_dir): - def do_install(): - subprocess.run( - ["npm", "install", "--no-fund", "--no-audit"], - cwd=os.path.join(root_dir, example_dir), - check=True, - ) - - get_xdist_session_value( - do_install, - request, - example_dir, - ) - - -def compare_screenshot(screenshot, expected_screenshot, extras, threshold=20): - # Avoid doing comparison within `assert` because pytest's built-in diffing - # is too slow. - actual = np.asarray(PIL.Image.open(io.BytesIO(screenshot))) - expected = np.asarray(PIL.Image.open(io.BytesIO(expected_screenshot))) - - absdiff = np.abs( - np.asarray(actual, dtype=np.int16) - np.asarray(expected, dtype=np.int16) - ) - - max_difference = np.max(absdiff) - - mask = np.max(absdiff, axis=2) > threshold - mask = mask[..., np.newaxis] * np.array([255, 255, 255, 255], dtype=np.uint8) - mismatch = np.any(mask) - - mask_image_buffer = io.BytesIO() - PIL.Image.fromarray(mask).save(mask_image_buffer, format="png") - mask_image_encoded = mask_image_buffer.getvalue() - - expected_b64 = base64.b64encode(expected_screenshot).decode("utf-8") - actual_b64 = base64.b64encode(screenshot).decode("utf-8") - mask_b64 = base64.b64encode(mask_image_encoded).decode("utf-8") - - extras.append( - pytest_html.extras.html( - f""" -
- - - -
- """ - ) - ) - extras.append( - pytest_html.extras.html( - f'' - ) - ) - - if mismatch: - pytest.fail(f"Screenshots don't match, max_difference={max_difference}") - - -# Flaky due to https://github.com/parcel-bundler/parcel/issues/9476 -@pytest.mark.flaky(reruns=5) -@pytest.mark.timeout(timeout=60, func_only=True) -def test_dev_server( - request, - webdriver_generic, - built_package, - example_dir, - installed_example_dir, - extras, -): - screenshot = capture_screenshot_from_dev_server( - webdriver=webdriver_generic, - example_dir=os.path.join(root_dir, example_dir), - test_fragment=TEST_FRAGMENT, - ) - - compare_screenshot( - screenshot, request.getfixturevalue("expected_screenshot"), extras - ) - - -# Flaky due to https://github.com/parcel-bundler/parcel/issues/9476 -@pytest.mark.flaky(reruns=5) -@pytest.mark.timeout(timeout=60, func_only=True) -def test_build( - request, - webdriver_generic, - built_package, - example_dir, - installed_example_dir, - extras, -): - screenshot = capture_screenshot_from_build( - webdriver=webdriver_generic, - example_dir=os.path.join(root_dir, example_dir), - test_fragment=TEST_FRAGMENT, - ) - - compare_screenshot( - screenshot, request.getfixturevalue("expected_screenshot"), extras - ) - - -@pytest.mark.timeout(timeout=60, func_only=True) -def test_root_build( - request, - webdriver_generic, - extras, -): - screenshot = capture_screenshot_from_build( - webdriver=webdriver_generic, - example_dir=root_dir, - output_dir=os.path.join(root_dir, "dist", "client"), - test_fragment=TEST_FRAGMENT, - extra_args=["--no-typecheck", "--no-lint"], - ) - - compare_screenshot( - screenshot, request.getfixturevalue("expected_screenshot"), extras - ) diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 23fcb184bc..6c6df3c33b 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -62,6 +62,10 @@ def pytest_addoption(parser): default="chrome", help="Specifies the browser to use.", ) + parser.addoption( + "--browser-binary-path", + help="Overrides default browser executable path.", + ) parser.addoption( "--skip-browser-tests", action="store_true", @@ -89,6 +93,7 @@ def _webdriver_internal(request): docker=request.config.getoption("--webdriver-docker"), debug=request.config.getoption("--debug-webdriver"), browser=request.config.getoption("--browser"), + browser_binary_path=request.config.getoption("--browser-binary-path"), ) if request.config.getoption("--neuroglancer-server-debug"): neuroglancer.server.debug = True @@ -105,6 +110,7 @@ def webdriver_generic(request): docker=request.config.getoption("--webdriver-docker"), debug=request.config.getoption("--debug-webdriver"), browser=request.config.getoption("--browser"), + browser_binary_path=request.config.getoption("--browser-binary-path"), ) atexit.register(webdriver.driver.close) return webdriver diff --git a/python/tests/n5_test.py b/python/tests/n5_test.py index d03e23009e..d9432b46a1 100644 --- a/python/tests/n5_test.py +++ b/python/tests/n5_test.py @@ -19,14 +19,16 @@ import numpy as np import pytest -TEST_DATA_DIR = pathlib.Path(__file__).parent.parent / "testdata" - @pytest.mark.parametrize( "spec", [ {"driver": "n5", "metadata": {"compression": {"type": "raw"}}}, {"driver": "n5", "metadata": {"compression": {"type": "gzip"}}}, + { + "driver": "n5", + "metadata": {"compression": {"type": "gzip", "useZlib": True}}, + }, { "driver": "n5", "metadata": { @@ -38,8 +40,7 @@ } }, }, - # TODO(jbms): Add once tensorstore supports zstd - # {"driver": "n5", "metadata": {"compression": {"type": "zstd"}}}, + {"driver": "n5", "metadata": {"compression": {"type": "zstd"}}}, ], ids=str, ) diff --git a/python/tests/on_demand_mesh_generator_test.py b/python/tests/on_demand_mesh_generator_test.py index b1f265d043..8e28af49b5 100644 --- a/python/tests/on_demand_mesh_generator_test.py +++ b/python/tests/on_demand_mesh_generator_test.py @@ -20,7 +20,7 @@ import pytest from neuroglancer import local_volume, test_util, viewer_state -testdata_dir = os.path.join(os.path.dirname(__file__), "..", "testdata", "mesh") +testdata_dir = os.path.join(os.path.dirname(__file__), "..", "..", "testdata", "mesh") @pytest.mark.xfail( diff --git a/python/tests/precomputed_test.py b/python/tests/precomputed_test.py new file mode 100644 index 0000000000..53e9f6040e --- /dev/null +++ b/python/tests/precomputed_test.py @@ -0,0 +1,93 @@ +# @license +# Copyright 2023 Google Inc. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests the n5 datasource.""" + +import pathlib + +import neuroglancer +import numpy as np +import pytest + + +@pytest.mark.parametrize( + "spec", + [ + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "png", "chunk_size": [8, 9, 1]}, + "dtype": "uint8", + "schema": {"domain": {"shape": [10, 20, 5, num_channels]}}, + } + for num_channels in [1, 2, 3, 4] + ] + + [ + # Currently TensorStore does not support uint16 with more than one channel. + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "png"}, + "dtype": "uint16", + "schema": {"domain": {"shape": [10, 20, 5, 1]}}, + } + ] + + [ + # Due to a tensorstore bug (https://github.com/google/neuroglancer/issues/677) + # the block shape must be square. + { + "driver": "neuroglancer_precomputed", + "scale_metadata": {"encoding": "jpeg", "chunk_size": [10, 10, 1]}, + "dtype": "uint8", + "schema": {"domain": {"shape": [10, 20, 1, num_channels]}}, + } + for num_channels in [1, 3] + ], + ids=str, +) +def test_precomputed(tempdir_server: tuple[pathlib.Path, str], webdriver, spec): + import tensorstore as ts + + tmp_path, server_url = tempdir_server + + full_spec = { + "kvstore": { + "driver": "file", + "path": str(tmp_path), + } + } + full_spec.update(spec) + + store = ts.open(full_spec, create=True).result() + + a = np.arange(np.prod(store.shape), dtype=store.dtype.numpy_dtype).reshape( + store.shape + ) + + store[...] = a + + with webdriver.viewer.txn() as s: + s.layers.append( + name="a", + layer=neuroglancer.ImageLayer(source=f"precomputed://{server_url}"), + ) + + if store.shape[-1] == 1: + # Neuroglancer elides the channel dimension if there is only 1 channel + store = store[..., 0] + + vol = webdriver.viewer.volume("a").result() + b = vol.read().result() + + if spec["scale_metadata"]["encoding"] == "jpeg": + np.testing.assert_allclose(store.read().result(), b, atol=4, rtol=0) + else: + np.testing.assert_equal(store.read().result(), b) diff --git a/python/tests/zarr_test.py b/python/tests/zarr_test.py index 74b3586ccd..240e81971c 100644 --- a/python/tests/zarr_test.py +++ b/python/tests/zarr_test.py @@ -19,13 +19,16 @@ import numpy as np import pytest -TEST_DATA_DIR = pathlib.Path(__file__).parent.parent / "testdata" +TEST_DATA_DIR = ( + pathlib.Path(__file__).parent.parent.parent / "testdata" / "datasource" / "zarr" +) @pytest.mark.parametrize( "spec", [ {"driver": "zarr"}, + {"driver": "zarr", "metadata": {"compressor": {"id": "zlib"}}}, {"driver": "zarr", "schema": {"chunk_layout": {"inner_order": [2, 1, 0]}}}, {"driver": "zarr3"}, {"driver": "zarr3", "schema": {"chunk_layout": {"inner_order": [2, 1, 0]}}}, @@ -49,6 +52,17 @@ } }, }, + { + "driver": "zarr3", + "schema": { + "chunk_layout": { + "inner_order": [2, 0, 1], + "read_chunk": {"shape": [2, 3, 4]}, + "write_chunk": {"shape": [6, 12, 20]}, + } + }, + "kvstore": {"driver": "ocdbt"}, + }, { "driver": "zarr3", "schema": {"chunk_layout": {"write_chunk": {"shape": [6, 12, 24]}}}, @@ -134,25 +148,72 @@ def test_zarr(tempdir_server: tuple[pathlib.Path, str], webdriver, spec): a = np.arange(np.prod(shape), dtype=np.int32).reshape(shape) - full_spec = { + file_spec = { + "driver": "file", + "path": str(tmp_path), + } + + if "kvstore" in spec: + full_spec = {**spec, "kvstore": {**spec["kvstore"], "base": file_spec}} + else: + full_spec = {**spec, "kvstore": file_spec} + + store = ts.open(full_spec, create=True, dtype=ts.int32, shape=shape).result() + store[...] = a + + with webdriver.viewer.txn() as s: + s.layers.append(name="a", layer=neuroglancer.ImageLayer(source=server_url)) + + vol = webdriver.viewer.volume("a").result() + b = vol.read().result() + np.testing.assert_equal(a, b) + + +def test_zarr_corrupt(tempdir_server: tuple[pathlib.Path, str], webdriver): + import tensorstore as ts + + tmp_path, server_url = tempdir_server + + shape = [10, 20, 30] + + a = np.arange(np.prod(shape), dtype=np.int32).reshape(shape) + + full_spec_for_chunks = { + "driver": "zarr3", "kvstore": { "driver": "file", "path": str(tmp_path), - } + }, + "metadata": {"codecs": ["zstd"]}, } - full_spec.update(spec) - store = ts.open(full_spec, create=True, dtype=ts.int32, shape=shape).result() + full_spec_for_metadata = { + "driver": "zarr3", + "kvstore": { + "driver": "file", + "path": str(tmp_path), + }, + "metadata": {"codecs": ["gzip"]}, + } + + ts.open(full_spec_for_metadata, create=True, dtype=ts.int32, shape=shape).result() + store = ts.open( + full_spec_for_chunks, + open=True, + assume_metadata=True, + dtype=ts.int32, + shape=shape, + ).result() store[...] = a with webdriver.viewer.txn() as s: s.layers.append( - name="a", layer=neuroglancer.ImageLayer(source=f"zarr://{server_url}") + name="a", layer=neuroglancer.ImageLayer(source=f"zarr3://{server_url}") ) vol = webdriver.viewer.volume("a").result() - b = vol.read().result() - np.testing.assert_equal(a, b) + with pytest.raises(ValueError, match=".*Failed to decode gzip"): + vol.read().result() EXCLUDED_ZARR_V2_CASES = { diff --git a/webpack.config.js b/rspack.config.js similarity index 65% rename from webpack.config.js rename to rspack.config.js index 7047d01fd8..2b1b7db474 100644 --- a/webpack.config.js +++ b/rspack.config.js @@ -1,10 +1,7 @@ import path from "node:path"; -import { EsbuildPlugin } from "esbuild-loader"; -import HtmlWebpackPlugin from "html-webpack-plugin"; -import MiniCssExtractPlugin from "mini-css-extract-plugin"; -import webpack from "webpack"; -import StartupChunkDependenciesPlugin from "webpack/lib/runtime/StartupChunkDependenciesPlugin.js"; -import { normalizeConfigurationWithDefine } from "./build_tools/webpack/configuration_with_define.js"; +import { HtmlRspackPlugin, ProgressPlugin } from "@rspack/core"; +import { normalizeConfigurationWithDefine } from "./build_tools/rspack/configuration_with_define.js"; +import packageJson from "./package.json"; export default (env, args) => { const mode = args.mode === "production" ? "production" : "development"; @@ -23,13 +20,6 @@ export default (env, args) => { splitChunks: { chunks: "all", }, - minimizer: [ - new EsbuildPlugin({ - target: "es2020", - format: "esm", - css: true, - }), - ], }, devtool: "source-map", module: { @@ -37,11 +27,19 @@ export default (env, args) => { // Needed to support Neuroglancer TypeScript sources. { test: /\.tsx?$/, - loader: "esbuild-loader", + loader: "builtin:swc-loader", options: { - // Needed to ensure `import.meta.url` is available. - target: "es2020", + jsc: { + parser: { + syntax: "typescript", + decorators: true, + }, + }, + env: { + targets: packageJson.browserslist, + }, }, + type: "javascript/auto", }, { test: /\.wasm$/, @@ -64,19 +62,6 @@ export default (env, args) => { filename: "[name][ext]", }, }, - // Necessary to handle CSS files. - { - test: /\.css$/, - use: [ - { - loader: - mode === "production" - ? MiniCssExtractPlugin.loader - : "style-loader", - }, - { loader: "css-loader" }, - ], - }, ], }, devServer: { @@ -89,37 +74,23 @@ export default (env, args) => { hot: false, }, plugins: [ - // Fixes esm output with splitChunks - // https://github.com/webpack/webpack/pull/17015/files - new StartupChunkDependenciesPlugin({ - chunkLoading: "import", - asyncChunkLoading: true, - }), - new webpack.ProgressPlugin(), - ...(mode === "production" - ? [new MiniCssExtractPlugin({ filename: "[name].[chunkhash].css" })] - : []), - new HtmlWebpackPlugin({ - title: "Neuroglancer", - scriptLoading: "module", + new ProgressPlugin(), + new HtmlRspackPlugin({ + title: "neuroglancer", }), ], output: { path: path.resolve(import.meta.dirname, "dist", "client"), filename: "[name].[chunkhash].js", chunkFilename: "[name].[contenthash].js", - chunkLoading: "import", - workerChunkLoading: "import", - chunkFormat: "module", asyncChunks: true, - module: true, clean: true, }, - target: ["es2020", "web"], + target: ["web", "browserslist"], experiments: { - outputModule: true, + css: true, }, - // Additional defines, to be added via `webpack.DefinePlugin`. This is not a + // Additional defines, to be added via `DefinePlugin`. This is not a // standard webpack configuration property, but is handled specially by // `normalizeConfigurationWithDefine`. define: { @@ -146,6 +117,9 @@ export default (env, args) => { // NEUROGLANCER_GOOGLE_TAG_MANAGER: JSON.stringify('GTM-XXXXXX'), }, + watchOptions: { + ignored: /node_modules/, + }, }; return env.NEUROGLANCER_CLI ? config diff --git a/setup.py b/setup.py index 7fd8e08317..35c0fc3cad 100755 --- a/setup.py +++ b/setup.py @@ -130,7 +130,7 @@ class BundleClientCommand( ): editable_mode: bool = False - user_options = [ + user_options = [ # type: ignore[assignment] ( "client-bundle-type=", None, diff --git a/src/annotation/backend.ts b/src/annotation/backend.ts index febc1812db..1c8444e9a1 100644 --- a/src/annotation/backend.ts +++ b/src/annotation/backend.ts @@ -66,7 +66,6 @@ import { } from "#src/sliceview/backend.js"; import type { TransformedSource } from "#src/sliceview/base.js"; import { registerNested, WatchableValue } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import type { Uint64 } from "#src/util/uint64.js"; import { @@ -100,7 +99,7 @@ export class AnnotationMetadataChunk extends Chunk { } export class AnnotationGeometryData implements SerializedAnnotations { - data: Uint8Array; + data: Uint8Array; typeToOffset: number[]; typeToIds: string[][]; typeToIdMaps: Map[]; @@ -149,11 +148,11 @@ function GeometryChunkMixin( export class AnnotationGeometryChunk extends GeometryChunkMixin( SliceViewChunk, ) { - source: AnnotationGeometryChunkSourceBackend; + declare source: AnnotationGeometryChunkSourceBackend; } export class AnnotationSubsetGeometryChunk extends GeometryChunkMixin(Chunk) { - source: AnnotationSubsetGeometryChunkSource; + declare source: AnnotationSubsetGeometryChunkSource; objectId: Uint64; } @@ -171,11 +170,8 @@ class AnnotationMetadataChunkSource extends ChunkSource { return chunk; } - download( - chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, - ) { - return this.parent!.downloadMetadata(chunk, cancellationToken); + download(chunk: AnnotationMetadataChunk, signal: AbortSignal) { + return this.parent!.downloadMetadata(chunk, signal); } } @@ -195,7 +191,7 @@ AnnotationGeometryChunkSourceBackend.prototype.chunkConstructor = @registerSharedObject(ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID) class AnnotationSubsetGeometryChunkSource extends ChunkSource { parent: Borrowed | undefined = undefined; - chunks: Map; + declare chunks: Map; relationshipIndex: number; getChunk(objectId: Uint64) { const key = getObjectKey(objectId); @@ -209,14 +205,11 @@ class AnnotationSubsetGeometryChunkSource extends ChunkSource { } return chunk; } - download( - chunk: AnnotationSubsetGeometryChunk, - cancellationToken: CancellationToken, - ) { + download(chunk: AnnotationSubsetGeometryChunk, signal: AbortSignal) { return this.parent!.downloadSegmentFilteredGeometry( chunk, this.relationshipIndex, - cancellationToken, + signal, ); } } @@ -227,12 +220,12 @@ export interface AnnotationSource { // TypeScript supports mixins with abstract classes. downloadMetadata( chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise; downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise; } diff --git a/src/annotation/bounding_box.ts b/src/annotation/bounding_box.ts index 60100918f9..00ed93eba1 100644 --- a/src/annotation/bounding_box.ts +++ b/src/annotation/bounding_box.ts @@ -37,7 +37,7 @@ import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js" import { tile2dArray } from "#src/util/array.js"; import { getViewFrustrumWorldBounds, mat4 } from "#src/util/geom.js"; import { CORNERS_PER_BOX, EDGES_PER_BOX } from "#src/webgl/bounding_box.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, @@ -293,7 +293,7 @@ void setBoundingBoxFillColor(vec4 color) { class PerspectiveViewRenderHelper extends RenderHelper { private edgeBoxCornerOffsetsBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( this.gl, tile2dArray( edgeBoxCornerOffsetData, @@ -346,7 +346,7 @@ emitAnnotation(vec4(vColor.rgb, getLineAlpha() * vClipCoefficient)); ); private boxCornerOffsetsBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( this.gl, tile2dArray( vertexBasePositions, diff --git a/src/annotation/frontend_source.ts b/src/annotation/frontend_source.ts index 1d6bc9423b..c33e684172 100644 --- a/src/annotation/frontend_source.ts +++ b/src/annotation/frontend_source.ts @@ -61,7 +61,7 @@ import { ENDIANNESS, Endianness } from "#src/util/endian.js"; import * as matrix from "#src/util/matrix.js"; import type { Signal } from "#src/util/signal.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { RPC } from "#src/worker_rpc.js"; import { @@ -90,7 +90,7 @@ export function computeNumPickIds( } export class AnnotationGeometryData { - buffer: Buffer | undefined; + buffer: GLBuffer | undefined; bufferValid = false; serializedAnnotations: SerializedAnnotations; numPickIds = 0; @@ -115,7 +115,7 @@ export class AnnotationGeometryData { } export class AnnotationSubsetGeometryChunk extends Chunk { - source: AnnotationSubsetGeometryChunkSource; + declare source: AnnotationSubsetGeometryChunkSource; // undefined indicates chunk not found data: AnnotationGeometryData | undefined; constructor(source: AnnotationSubsetGeometryChunkSource, x: any) { @@ -139,7 +139,7 @@ export class AnnotationSubsetGeometryChunk extends Chunk { } export class AnnotationGeometryChunk extends SliceViewChunk { - source: AnnotationGeometryChunkSource; + declare source: AnnotationGeometryChunkSource; // undefined indicates chunk not found data: AnnotationGeometryData | undefined; @@ -168,7 +168,7 @@ export class AnnotationGeometryChunkSource extends SliceViewChunkSource< AnnotationGeometryChunkSpecification, AnnotationGeometryChunk > { - OPTIONS: AnnotationGeometryChunkSourceOptions; + declare OPTIONS: AnnotationGeometryChunkSourceOptions; parent: Borrowed; immediateChunkUpdates = true; @@ -226,7 +226,7 @@ export class AnnotationGeometryChunkSource extends SliceViewChunkSource< @registerSharedObjectOwner(ANNOTATION_SUBSET_GEOMETRY_CHUNK_SOURCE_RPC_ID) export class AnnotationSubsetGeometryChunkSource extends ChunkSource { immediateChunkUpdates = true; - chunks: Map; + declare chunks: Map; constructor( chunkManager: Borrowed, @@ -256,7 +256,7 @@ export class AnnotationMetadataChunk extends Chunk { @registerSharedObjectOwner(ANNOTATION_METADATA_CHUNK_SOURCE_RPC_ID) export class AnnotationMetadataChunkSource extends ChunkSource { - chunks: Map; + declare chunks: Map; constructor( chunkManager: Borrowed, public parent: Borrowed, @@ -290,7 +290,7 @@ function copyOtherAnnotations( propertySerializers: AnnotationPropertySerializer[], excludedType: AnnotationType, excludedTypeAdjustment: number, -): Uint8Array { +): Uint8Array { const newData = new Uint8Array( serializedAnnotations.data.length + excludedTypeAdjustment, ); @@ -510,9 +510,7 @@ export class MultiscaleAnnotationSource { OPTIONS: object; key: any; - metadataChunkSource = this.registerDisposer( - new AnnotationMetadataChunkSource(this.chunkManager, this), - ); + metadataChunkSource: AnnotationMetadataChunkSource; segmentFilteredSources: Owned[]; spatiallyIndexedSources = new Set>(); rank: number; @@ -528,6 +526,9 @@ export class MultiscaleAnnotationSource }, ) { super(); + this.metadataChunkSource = this.registerDisposer( + new AnnotationMetadataChunkSource(this.chunkManager, this), + ); this.rank = options.rank; this.properties = options.properties; this.annotationPropertySerializers = makeAnnotationPropertySerializers( diff --git a/src/annotation/index.ts b/src/annotation/index.ts index f920d1a96d..db2dded24e 100644 --- a/src/annotation/index.ts +++ b/src/annotation/index.ts @@ -1363,7 +1363,7 @@ export function makeDataBoundsBoundingBoxAnnotationSet( } export interface SerializedAnnotations { - data: Uint8Array; + data: Uint8Array; typeToIds: string[][]; typeToOffset: number[]; typeToIdMaps: Map[]; diff --git a/src/annotation/renderlayer.ts b/src/annotation/renderlayer.ts index 836fa8dd13..b0ab74f9e4 100644 --- a/src/annotation/renderlayer.ts +++ b/src/annotation/renderlayer.ts @@ -128,7 +128,7 @@ import type { AnyConstructor, MixinConstructor } from "#src/util/mixin.js"; import { NullarySignal } from "#src/util/signal.js"; import type { Uint64 } from "#src/util/uint64.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { ParameterizedContextDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import type { @@ -228,7 +228,7 @@ export class AnnotationLayer extends RefCounted { /** * Stores a serialized representation of the information needed to render the annotations. */ - buffer: Buffer | undefined; + buffer: GLBuffer | undefined; numPickIds = 0; @@ -265,32 +265,9 @@ export class AnnotationLayer extends RefCounted { return sharedObject.visibility; } - segmentationStates = this.registerDisposer( - makeCachedDerivedWatchableValue( - (_relationshipStates, _ignoreNullSegmentFilter) => { - const { displayState, source } = this.state; - const { relationshipStates } = displayState; - return displayState.displayUnfiltered.value - ? undefined - : source.relationships.map((relationship) => { - const state = relationshipStates.get(relationship); - return state.showMatches.value - ? state.segmentationState.value - : undefined; - }); - }, - [ - this.state.displayState.relationshipStates, - this.state.displayState.ignoreNullSegmentFilter, - ], - (a, b) => { - if (a === undefined || b === undefined) { - return a === b; - } - return arraysEqual(a, b); - }, - ), - ); + segmentationStates: WatchableValueInterface< + OptionalSegmentationDisplayState[] | undefined + >; constructor( public chunkManager: ChunkManager, @@ -298,6 +275,32 @@ export class AnnotationLayer extends RefCounted { ) { super(); this.registerDisposer(state); + this.segmentationStates = this.registerDisposer( + makeCachedDerivedWatchableValue( + (_relationshipStates, _ignoreNullSegmentFilter) => { + const { displayState, source } = this.state; + const { relationshipStates } = displayState; + return displayState.displayUnfiltered.value + ? undefined + : source.relationships.map((relationship) => { + const state = relationshipStates.get(relationship); + return state.showMatches.value + ? state.segmentationState.value + : undefined; + }); + }, + [ + this.state.displayState.relationshipStates, + this.state.displayState.ignoreNullSegmentFilter, + ], + (a, b) => { + if (a === undefined || b === undefined) { + return a === b; + } + return arraysEqual(a, b); + }, + ), + ); this.registerDisposer( this.source.changed.add(this.handleChangeAffectingBuffer), ); @@ -364,7 +367,7 @@ export class AnnotationLayer extends RefCounted { let { buffer } = this; if (buffer === undefined) { buffer = this.buffer = this.registerDisposer( - new Buffer(this.chunkManager.gl), + new GLBuffer(this.chunkManager.gl), ); } this.generation = generation; @@ -382,7 +385,7 @@ export class AnnotationLayer extends RefCounted { interface AnnotationGeometryDataInterface { serializedAnnotations: SerializedAnnotations; - buffer: Buffer; + buffer: GLBuffer; numPickIds: number; } @@ -606,7 +609,7 @@ function AnnotationRenderLayer< if (!chunk.bufferValid) { let { buffer } = chunk; if (buffer === undefined) { - buffer = chunk.buffer = new Buffer(this.gl); + buffer = chunk.buffer = new GLBuffer(this.gl); } const { serializedAnnotations } = chunk; buffer.setData(serializedAnnotations.data); diff --git a/src/annotation/type_handler.ts b/src/annotation/type_handler.ts index 4e6af18194..dc2f25f638 100644 --- a/src/annotation/type_handler.ts +++ b/src/annotation/type_handler.ts @@ -31,7 +31,7 @@ import type { SliceViewPanelRenderContext } from "#src/sliceview/renderlayer.js" import type { WatchableValueInterface } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import type { mat4 } from "#src/util/geom.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { GL } from "#src/webgl/context.js"; import type { @@ -65,7 +65,7 @@ export type AnnotationShaderGetter = ParameterizedContextDependentShaderGetter< >; export interface AnnotationRenderContext { - buffer: Buffer; + buffer: GLBuffer; annotationLayer: AnnotationLayer; renderContext: SliceViewPanelRenderContext | PerspectiveViewRenderContext; bufferOffset: number; diff --git a/src/async_computation.bundle.js b/src/async_computation.bundle.js index 25801ea045..87e07ac7b7 100644 --- a/src/async_computation.bundle.js +++ b/src/async_computation.bundle.js @@ -1,6 +1,8 @@ // Note: This file uses ".js" rather than ".ts" extension because we cannot rely // on Node.js subpath imports to translate paths for Workers since those paths // must be valid for use in `new URL` with multiple bundlers. +import "#src/util/polyfills.js"; import "#src/async_computation/encode_compressed_segmentation.js"; import "#src/datasource/enabled_async_computation_modules.js"; +import "#src/kvstore/enabled_async_computation_modules.js"; import "#src/async_computation/handler.js"; diff --git a/src/async_computation/decode_blosc.ts b/src/async_computation/decode_blosc.ts index effe9a723f..efca39e514 100644 --- a/src/async_computation/decode_blosc.ts +++ b/src/async_computation/decode_blosc.ts @@ -17,9 +17,9 @@ import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; import { registerAsyncComputation } from "#src/async_computation/handler.js"; -registerAsyncComputation(decodeBlosc, async (data: Uint8Array) => { +registerAsyncComputation(decodeBlosc, async (data) => { const { default: Blosc } = await import("numcodecs/blosc"); const codec = Blosc.fromConfig({ id: "blosc" }); - const result = await codec.decode(data); + const result = (await codec.decode(data)) as Uint8Array; return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_blosc_request.ts b/src/async_computation/decode_blosc_request.ts index 54f577b5da..b5d5f9ed3e 100644 --- a/src/async_computation/decode_blosc_request.ts +++ b/src/async_computation/decode_blosc_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeBlosc = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeBlosc"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeBlosc", + ); diff --git a/src/async_computation/decode_compresso.ts b/src/async_computation/decode_compresso.ts index 377c345d07..e9813a92c0 100644 --- a/src/async_computation/decode_compresso.ts +++ b/src/async_computation/decode_compresso.ts @@ -18,7 +18,7 @@ import { decodeCompresso } from "#src/async_computation/decode_compresso_request import { registerAsyncComputation } from "#src/async_computation/handler.js"; import { decompressCompresso } from "#src/sliceview/compresso/index.js"; -registerAsyncComputation(decodeCompresso, async (data: Uint8Array) => { +registerAsyncComputation(decodeCompresso, async (data) => { const result = await decompressCompresso(data); return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_compresso_request.ts b/src/async_computation/decode_compresso_request.ts index 3c36ad518b..d955a26295 100644 --- a/src/async_computation/decode_compresso_request.ts +++ b/src/async_computation/decode_compresso_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeCompresso = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeCompresso"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeCompresso", + ); diff --git a/src/async_computation/decode_jpeg.ts b/src/async_computation/decode_jpeg.ts index c20dbea214..bf073c7769 100644 --- a/src/async_computation/decode_jpeg.ts +++ b/src/async_computation/decode_jpeg.ts @@ -22,7 +22,7 @@ import { transposeArray2d } from "#src/util/array.js"; registerAsyncComputation( decodeJpeg, async ( - data: Uint8Array, + data, width: number | undefined, height: number | undefined, area: number | undefined, @@ -52,7 +52,7 @@ registerAsyncComputation( ); } numComponents = parser.numComponents; - let result: Uint8Array; + let result: Uint8Array; if (parser.numComponents === 1) { result = parser.getData( parser.width, diff --git a/src/async_computation/decode_jpeg_request.ts b/src/async_computation/decode_jpeg_request.ts index c5b9a7d1df..1aa9722520 100644 --- a/src/async_computation/decode_jpeg_request.ts +++ b/src/async_computation/decode_jpeg_request.ts @@ -18,7 +18,7 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeJpeg = asyncComputation< ( - data: Uint8Array, + data: Uint8Array, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_png.ts b/src/async_computation/decode_png.ts index ed33df0763..57e37a3c48 100644 --- a/src/async_computation/decode_png.ts +++ b/src/async_computation/decode_png.ts @@ -21,7 +21,7 @@ import { decompressPng } from "#src/sliceview/png/index.js"; registerAsyncComputation( decodePng, async ( - data: Uint8Array, + data, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_png_request.ts b/src/async_computation/decode_png_request.ts index 0980b4e453..46d05a2228 100644 --- a/src/async_computation/decode_png_request.ts +++ b/src/async_computation/decode_png_request.ts @@ -19,12 +19,12 @@ export interface DecodedImage { width: number; height: number; numComponents: number; - uint8Array: Uint8Array; + uint8Array: Uint8Array; } export const decodePng = asyncComputation< ( - data: Uint8Array, + data: Uint8Array, width: number | undefined, height: number | undefined, // Expected width * height diff --git a/src/async_computation/decode_zstd.ts b/src/async_computation/decode_zstd.ts index becdaf5901..f4808b7c89 100644 --- a/src/async_computation/decode_zstd.ts +++ b/src/async_computation/decode_zstd.ts @@ -17,9 +17,9 @@ import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; import { registerAsyncComputation } from "#src/async_computation/handler.js"; -registerAsyncComputation(decodeZstd, async (data: Uint8Array) => { +registerAsyncComputation(decodeZstd, async (data) => { const { default: Zstd } = await import("numcodecs/zstd"); const codec = Zstd.fromConfig({ id: "blosc" }); - const result = await codec.decode(data); + const result = (await codec.decode(data)) as Uint8Array; return { value: result, transfer: [result.buffer] }; }); diff --git a/src/async_computation/decode_zstd_node.ts b/src/async_computation/decode_zstd_node.ts new file mode 100644 index 0000000000..01ee5e92bb --- /dev/null +++ b/src/async_computation/decode_zstd_node.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Alternative implementation of zstd decoding using the pure JavaScript `fzstd` +// library for use when running tests within node.js. +// +// The numcodecs/zstd library (WebAssembly-based) fails when run from +// @vitest/web-worker. + +import { decompress } from "fzstd"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { registerAsyncComputation } from "#src/async_computation/handler.js"; + +registerAsyncComputation(decodeZstd, async (data) => { + const result = decompress(data) as Uint8Array; + return { value: result, transfer: [result.buffer] }; +}); diff --git a/src/async_computation/decode_zstd_request.ts b/src/async_computation/decode_zstd_request.ts index 25c709d366..b895e9f4d3 100644 --- a/src/async_computation/decode_zstd_request.ts +++ b/src/async_computation/decode_zstd_request.ts @@ -17,4 +17,6 @@ import { asyncComputation } from "#src/async_computation/index.js"; export const decodeZstd = - asyncComputation<(data: Uint8Array) => Uint8Array>("decodeZstd"); + asyncComputation<(data: Uint8Array) => Uint8Array>( + "decodeZstd", + ); diff --git a/src/async_computation/handler.ts b/src/async_computation/handler.ts index 0467954d1a..a86ded91bc 100644 --- a/src/async_computation/handler.ts +++ b/src/async_computation/handler.ts @@ -22,17 +22,23 @@ const handlers = new Map< >(); function setupChannel(port: DedicatedWorkerGlobalScope) { - self.onmessage = (msg: any) => { + self.onmessage = async (msg: any) => { const { t, id, args } = msg.data as { t: string; id: number; args: any[] }; - const handler = handlers.get(t)!; - handler(...args).then( - ({ value, transfer }) => port.postMessage({ id, value }, { transfer }), - (error) => - port.postMessage({ - id, - error: error instanceof Error ? error.message : error.toString(), - }), - ); + try { + const handler = handlers.get(t)!; + if (handler === undefined) { + throw new Error( + `Internal error: async computation operation ${JSON.stringify(t)} is not registered. Registered handlers: ${JSON.stringify(Array.from(handlers.keys()))}`, + ); + } + const { value, transfer } = await handler(...args); + port.postMessage({ id, value }, { transfer }); + } catch (error) { + port.postMessage({ + id, + error, + }); + } }; // Notify that the worker is ready to receive messages. self.postMessage(null); diff --git a/src/async_computation/obj_mesh.ts b/src/async_computation/obj_mesh.ts index 68646946d0..35ec5820a3 100644 --- a/src/async_computation/obj_mesh.ts +++ b/src/async_computation/obj_mesh.ts @@ -24,8 +24,7 @@ import { Uint32ArrayBuilder } from "#src/util/uint32array_builder.js"; registerAsyncComputation( parseOBJFromArrayBuffer, async (buffer: ArrayBuffer) => { - buffer = await maybeDecompressGzip(buffer); - let text = new TextDecoder().decode(buffer); + let text = new TextDecoder().decode(await maybeDecompressGzip(buffer)); // Strip comments text = text.replace(/#.*/g, ""); const vertexPositions = new Float32ArrayBuilder(); diff --git a/src/async_computation/request.ts b/src/async_computation/request.ts index 05ddd5c106..d0b31f6119 100644 --- a/src/async_computation/request.ts +++ b/src/async_computation/request.ts @@ -15,21 +15,18 @@ */ import type { AsyncComputationSpec } from "#src/async_computation/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; let numWorkers = 0; const freeWorkers: Worker[] = []; const pendingTasks = new Map< number, - { msg: any; transfer: Transferable[] | undefined } + { msg: any; transfer: Transferable[] | undefined; cleanup?: () => void } >(); const tasks = new Map< number, { resolve: (value: any) => void; reject: (error: any) => void; - cleanup: () => void; } >(); // On Safari, `navigator.hardwareConcurrency` is not defined. @@ -42,6 +39,7 @@ let nextTaskId = 0; function returnWorker(worker: Worker) { for (const [id, task] of pendingTasks) { pendingTasks.delete(id); + task.cleanup?.(); worker.postMessage(task.msg, task.transfer as Transferable[]); return; } @@ -75,9 +73,8 @@ function launchWorker() { const callbacks = tasks.get(id)!; tasks.delete(id); if (callbacks === undefined) return; - callbacks.cleanup(); if (error !== undefined) { - callbacks.reject(new Error(error)); + callbacks.reject(error); } else { callbacks.resolve(value); } @@ -88,27 +85,40 @@ export function requestAsyncComputation< Signature extends (...args: any) => any, >( request: AsyncComputationSpec, - cancellationToken: CancellationToken, + signal: AbortSignal | undefined, transfer: Transferable[] | undefined, ...args: Parameters ): Promise> { - if (cancellationToken.isCanceled) return Promise.reject(CANCELED); const id = nextTaskId++; const msg = { t: request.id, id, args: args }; - const cleanup = cancellationToken.add(() => { - pendingTasks.delete(id); - tasks.delete(id); - }); + + signal?.throwIfAborted(); + const promise = new Promise>((resolve, reject) => { - tasks.set(id, { resolve, reject, cleanup }); + tasks.set(id, { resolve, reject }); }); + if (freeWorkers.length !== 0) { freeWorkers.pop()!.postMessage(msg, transfer as Transferable[]); } else { - pendingTasks.set(id, { msg, transfer }); + let cleanup: (() => void) | undefined; + if (signal !== undefined) { + function abortHandler() { + pendingTasks.delete(id); + const task = tasks.get(id)!; + tasks.delete(id); + task.reject(signal!.reason); + } + signal.addEventListener("abort", abortHandler, { once: true }); + cleanup = () => { + signal.removeEventListener("abort", abortHandler); + }; + } + pendingTasks.set(id, { msg, transfer, cleanup }); if (tasks.size > numWorkers && numWorkers < maxWorkers) { launchWorker(); } } + return promise; } diff --git a/src/axes_lines.ts b/src/axes_lines.ts index d281948665..e13d90c011 100644 --- a/src/axes_lines.ts +++ b/src/axes_lines.ts @@ -17,7 +17,7 @@ import type { ProjectionParameters } from "#src/projection_parameters.js"; import { RefCounted } from "#src/util/disposable.js"; import { mat4 } from "#src/util/geom.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderProgram } from "#src/webgl/shader.js"; import { trivialColorShader } from "#src/webgl/trivial_shaders.js"; @@ -46,14 +46,14 @@ export function computeAxisLineMatrix( } export class AxesLineHelper extends RefCounted { - vertexBuffer: Buffer; - colorBuffer: Buffer; + vertexBuffer: GLBuffer; + colorBuffer: GLBuffer; trivialColorShader: ShaderProgram; constructor(public gl: GL) { super(); this.vertexBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( gl, new Float32Array([ 0, @@ -88,7 +88,7 @@ export class AxesLineHelper extends RefCounted { const alpha = 0.5; this.colorBuffer = this.registerDisposer( - Buffer.fromData( + GLBuffer.fromData( gl, new Float32Array([ 1, diff --git a/src/chunk_manager/backend.ts b/src/chunk_manager/backend.ts index 4c6e7800bf..62457ac015 100644 --- a/src/chunk_manager/backend.ts +++ b/src/chunk_manager/backend.ts @@ -36,8 +36,6 @@ import { } from "#src/chunk_manager/base.js"; import type { SharedWatchableValue } from "#src/shared_watchable_value.js"; import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { Borrowed, Disposable } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; import LinkedList0 from "#src/util/linked_list.0.js"; @@ -127,10 +125,10 @@ export class Chunk implements Disposable { newRequestedState = ChunkState.NEW; /** - * Cancellation token used to cancel the pending download. Set to undefined except when state !== + * Abort controller used to cancel the pending download. Set to undefined except when state !== * DOWNLOADING. This should not be accessed by code outside this module. */ - downloadCancellationToken: CancellationTokenSource | undefined = undefined; + downloadAbortController: AbortController | undefined = undefined; initialize(key: string) { this.key = key; @@ -414,13 +412,12 @@ export interface ChunkSourceBase { * Note: This method must be defined by subclasses. * * @param chunk Chunk to download. - * @param cancellationToken If this token is canceled, the download/decoding should be aborted if - * possible. + * @param signal Used to abort download. * * TODO(jbms): Move this back to the class definition above and declare this abstract once mixins * are compatible with abstract classes. */ - download(chunk: Chunk, cancellationToken: CancellationToken): Promise; + download(chunk: Chunk, signal: AbortSignal): Promise; } export class ChunkSource extends ChunkSourceBase { @@ -434,13 +431,13 @@ export class ChunkSource extends ChunkSourceBase { } function startChunkDownload(chunk: Chunk) { - const downloadCancellationToken = (chunk.downloadCancellationToken = - new CancellationTokenSource()); + const downloadAbortController = (chunk.downloadAbortController = + new AbortController()); const startTime = Date.now(); - chunk.source!.download(chunk, downloadCancellationToken).then( + chunk.source!.download(chunk, downloadAbortController.signal).then( () => { - if (chunk.downloadCancellationToken === downloadCancellationToken) { - chunk.downloadCancellationToken = undefined; + if (chunk.downloadAbortController === downloadAbortController) { + chunk.downloadAbortController = undefined; const endTime = Date.now(); const { statistics } = chunk.source!; statistics[ @@ -453,8 +450,8 @@ function startChunkDownload(chunk: Chunk) { } }, (error: any) => { - if (chunk.downloadCancellationToken === downloadCancellationToken) { - chunk.downloadCancellationToken = undefined; + if (chunk.downloadAbortController === downloadAbortController) { + chunk.downloadAbortController = undefined; chunk.downloadFailed(error); console.log(`Error retrieving chunk ${chunk}: ${error}`); } @@ -463,9 +460,9 @@ function startChunkDownload(chunk: Chunk) { } function cancelChunkDownload(chunk: Chunk) { - const token = chunk.downloadCancellationToken!; - chunk.downloadCancellationToken = undefined; - token.cancel(); + const controller = chunk.downloadAbortController!; + chunk.downloadAbortController = undefined; + controller.abort(new DOMException("chunk download cancelled", "AbortError")); } class ChunkPriorityQueue { @@ -893,6 +890,11 @@ export class ChunkQueueManager extends SharedObjectCounterpart { this.scheduleUpdate(); } + markRecentlyUsed(chunk: Chunk) { + this.removeChunkFromQueues_(chunk); + this.addChunkToQueues_(chunk); + } + private processGPUPromotions_() { const queueManager = this; function evictFromGPUMemory(chunk: Chunk) { diff --git a/src/chunk_manager/frontend.ts b/src/chunk_manager/frontend.ts index bc85aea127..3df76ce075 100644 --- a/src/chunk_manager/frontend.ts +++ b/src/chunk_manager/frontend.ts @@ -29,8 +29,6 @@ import { import { SharedWatchableValue } from "#src/shared_watchable_value.js"; import { TrackableBoolean } from "#src/trackable_boolean.js"; import { TrackableValue } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; import type { Borrowed } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; import { StringMemoize } from "#src/util/memoize.js"; @@ -198,9 +196,9 @@ export class ChunkQueueManager extends SharedObject { } private handleFetch_(source: ChunkSource, update: any) { - const { resolve, reject, cancellationToken } = update.promise; - if ((cancellationToken).isCanceled) { - reject(CANCELED); + const { resolve, reject, signal } = update.promise; + if (signal.aborted) { + reject(signal.reason); return; } @@ -350,15 +348,12 @@ registerRPC("Chunk.update", function (x) { updateChunk(this, x); }); -registerPromiseRPC( - "Chunk.retrieve", - function (x, cancellationToken): RPCPromise { - return new Promise<{ value: any }>((resolve, reject) => { - x.promise = { resolve, reject, cancellationToken }; - updateChunk(this, x); - }); - }, -); +registerPromiseRPC("Chunk.retrieve", function (x, signal): RPCPromise { + return new Promise<{ value: any }>((resolve, reject) => { + x.promise = { resolve, reject, signal }; + updateChunk(this, x); + }); +}); registerRPC(CHUNK_LAYER_STATISTICS_RPC_ID, function (x) { const chunkManager = this.get(x.id) as ChunkManager; @@ -432,7 +427,7 @@ export interface ChunkRequesterState { // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging export class ChunkSource extends SharedObject { - OPTIONS: object; + declare OPTIONS: object; chunks = new Map(); chunkRequesters: Map | undefined; @@ -508,7 +503,7 @@ export function WithParameters< }; @registerSharedObjectOwner(parametersConstructor.RPC_ID) class C extends Base { - OPTIONS: WithParametersOptions; + declare OPTIONS: WithParametersOptions; parameters: Parameters; constructor(...args: any[]) { super(...args); diff --git a/src/chunk_manager/generic_file_source.ts b/src/chunk_manager/generic_file_source.ts index 6a90579489..cc57af20f7 100644 --- a/src/chunk_manager/generic_file_source.ts +++ b/src/chunk_manager/generic_file_source.ts @@ -21,256 +21,25 @@ import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, ChunkSourceBase } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - CANCELED, - makeCancelablePromise, - MultipleConsumerCancellationTokenSource, -} from "#src/util/cancellation.js"; -import type { Borrowed, Owned } from "#src/util/disposable.js"; -import { responseArrayBuffer } from "#src/util/http_request.js"; +import { ChunkState } from "#src/chunk_manager/base.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; +import type { Owned } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; +import type { AsyncMemoize } from "#src/util/memoize.js"; +import { asyncMemoizeWithProgress } from "#src/util/memoize.js"; import { getObjectId } from "#src/util/object_id.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; - -export type PriorityGetter = () => { - priorityTier: ChunkPriorityTier; - priority: number; -}; - -interface FileDataRequester { - resolve: (data: Data) => void; - reject: (error: any) => void; - getPriority: PriorityGetter; -} - -class GenericSharedDataChunk extends Chunk { - decodedKey?: Key; - data?: Data; - requesters?: Set>; - - initialize(key: string) { - super.initialize(key); - this.requesters = new Set>(); - } - - downloadSucceeded() { - super.downloadSucceeded(); - const { requesters, data } = this; - this.requesters = undefined; - for (const requester of requesters!) { - requester.resolve(data!); - } - } - - downloadFailed(error: any) { - super.downloadFailed(error); - const { requesters } = this; - this.requesters = undefined; - for (const requester of requesters!) { - requester.reject(error); - } - } - - freeSystemMemory() { - this.data = undefined; - } -} - -export interface GenericSharedDataSourceOptions { - encodeKey?: (key: Key) => string; - download: ( - key: Key, - cancellationToken: CancellationToken, - ) => Promise<{ size: number; data: Data }>; - sourceQueueLevel?: number; -} - -export class GenericSharedDataSource extends ChunkSourceBase { - chunks: Map>; - - private encodeKeyFunction: (key: Key) => string; - - private downloadFunction: ( - key: Key, - cancellationToken: CancellationToken, - ) => Promise<{ size: number; data: Data }>; - - constructor( - chunkManager: Owned, - options: GenericSharedDataSourceOptions, - ) { - super(chunkManager); - this.registerDisposer(chunkManager); - const { encodeKey = stableStringify } = options; - this.downloadFunction = options.download; - this.encodeKeyFunction = encodeKey; - const { sourceQueueLevel = 0 } = options; - this.sourceQueueLevel = sourceQueueLevel; - - // This source is unusual in that it updates its own chunk priorities. - this.registerDisposer( - this.chunkManager.recomputeChunkPrioritiesLate.add(() => { - this.updateChunkPriorities(); - }), - ); - } - - updateChunkPriorities() { - const { chunkManager } = this; - for (const chunk of this.chunks.values()) { - const { requesters } = chunk; - if (requesters !== undefined) { - for (const requester of requesters) { - const { priorityTier, priority } = requester.getPriority(); - if (priorityTier === ChunkPriorityTier.RECENT) continue; - chunkManager.requestChunk( - chunk, - priorityTier, - priority, - ChunkState.SYSTEM_MEMORY_WORKER, - ); - } - } - } - } - - async download( - chunk: GenericSharedDataChunk, - cancellationToken: CancellationToken, - ) { - const { size, data } = await this.downloadFunction( - chunk.decodedKey!, - cancellationToken, - ); - chunk.systemMemoryBytes = size; - chunk.data = data; - } - - /** - * Precondition: priorityTier <= ChunkPriorityTier.LAST_ORDERED_TIER - */ - getData( - key: Key, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, - ) { - const encodedKey = this.encodeKeyFunction(key); - let chunk = this.chunks.get(encodedKey); - if (chunk === undefined) { - chunk = this.getNewChunk_>( - GenericSharedDataChunk, - ); - chunk.decodedKey = key; - chunk.initialize(encodedKey); - this.addChunk(chunk); - } - return makeCancelablePromise( - cancellationToken, - (resolve, reject, token) => { - // If the data is already available or the request has already failed, resolve/reject the - // promise immediately. - switch (chunk!.state) { - case ChunkState.FAILED: - reject(chunk!.error); - return; - - case ChunkState.SYSTEM_MEMORY_WORKER: - resolve(chunk!.data!); - return; - } - const requester: FileDataRequester = { - resolve, - reject, - getPriority, - }; - chunk!.requesters!.add(requester); - token.add(() => { - const { requesters } = chunk!; - if (requesters !== undefined) { - requesters.delete(requester); - this.chunkManager.scheduleUpdateChunkPriorities(); - } - reject(CANCELED); - }); - this.chunkManager.scheduleUpdateChunkPriorities(); - }, - ); - } - - static get( - chunkManager: Borrowed, - memoizeKey: string, - options: GenericSharedDataSourceOptions, - ) { - return chunkManager.memoize.get( - `getFileSource:${memoizeKey}`, - () => new GenericSharedDataSource(chunkManager.addRef(), options), - ); - } - - static getData( - chunkManager: Borrowed, - memoizeKey: string, - options: GenericSharedDataSourceOptions, - key: Key, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, - ) { - const source = GenericSharedDataSource.get( - chunkManager, - memoizeKey, - options, - ); - const result = source.getData(key, getPriority, cancellationToken); - source.dispose(); - return result; - } - - static getUrl( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - decodeFunction: ( - buffer: ArrayBuffer, - cancellationToken: CancellationToken, - ) => Promise<{ size: number; data: Data }>, - url: string, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, - ) { - return GenericSharedDataSource.getData( - chunkManager, - `${getObjectId(decodeFunction)}`, - { - download: (url: string, cancellationToken: CancellationToken) => - cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFunction(response, cancellationToken)), - }, - url, - getPriority, - cancellationToken, - ); - } -} +import type { ProgressOptions } from "#src/util/progress_listener.js"; class AsyncCacheChunk extends Chunk { - promise: Promise | undefined; - cancellationSource: MultipleConsumerCancellationTokenSource | undefined; + asyncMemoize: AsyncMemoize | undefined; initialize(key: string) { super.initialize(key); } freeSystemMemory() { - this.promise = undefined; - this.cancellationSource = undefined; + this.asyncMemoize = undefined; } } @@ -278,12 +47,12 @@ export interface SimpleAsyncCacheOptions { encodeKey?: (key: Key) => string; get: ( key: Key, - cancellationToken: CancellationToken, + progressOptions: ProgressOptions, ) => Promise<{ size: number; data: Value }>; } export class SimpleAsyncCache extends ChunkSourceBase { - chunks: Map>; + declare chunks: Map>; constructor( chunkManager: Owned, @@ -297,10 +66,10 @@ export class SimpleAsyncCache extends ChunkSourceBase { encodeKeyFunction: (key: Key) => string; downloadFunction: ( key: Key, - cancellationToken: CancellationToken, + progressOptions: ProgressOptions, ) => Promise<{ size: number; data: Value }>; - get(key: Key, cancellationToken: CancellationToken): Promise { + get(key: Key, options: Partial): Promise { const encodedKey = this.encodeKeyFunction(key); let chunk = this.chunks.get(encodedKey); if (chunk === undefined) { @@ -308,20 +77,12 @@ export class SimpleAsyncCache extends ChunkSourceBase { chunk.initialize(encodedKey); this.addChunk(chunk); } - if (chunk.promise === undefined) { - let completed = false; - const cancellationSource = (chunk!.cancellationSource = - new MultipleConsumerCancellationTokenSource()); - cancellationSource.add(() => { - if (!completed) { - chunk!.promise = undefined; - } - }); - chunk.promise = (async () => { + if (chunk.asyncMemoize === undefined) { + chunk.asyncMemoize = asyncMemoizeWithProgress(async (progressOptions) => { try { const { data, size } = await this.downloadFunction( key, - cancellationSource, + progressOptions, ); chunk.systemMemoryBytes = size; chunk!.queueManager.updateChunkState( @@ -332,13 +93,13 @@ export class SimpleAsyncCache extends ChunkSourceBase { } catch (e) { chunk!.queueManager.updateChunkState(chunk!, ChunkState.FAILED); throw e; - } finally { - completed = true; } - })(); + }); + } + if (chunk.state === ChunkState.SYSTEM_MEMORY) { + chunk.chunkManager.queueManager.markRecentlyUsed(chunk); } - chunk.cancellationSource!.addConsumer(cancellationToken); - return chunk.promise; + return chunk.asyncMemoize(options); } } @@ -352,3 +113,38 @@ export function makeSimpleAsyncCache( () => new SimpleAsyncCache(chunkManager.addRef(), options), ); } + +export function getCachedDecodedUrl( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + decodeFunction: ( + readResponse: ReadResponse, + options: ProgressOptions, + ) => Promise<{ size: number; data: Data }>, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + `getCachedDecodedUrl:${getObjectId(decodeFunction)}`, + () => { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async (url: string, progressOptions: ProgressOptions) => { + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + url, + { ...progressOptions, throwIfMissing: true }, + ); + try { + return decodeFunction(readResponse, progressOptions); + } catch (e) { + throw new Error("Error reading ${url}", { cause: e }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get(url, options); +} diff --git a/src/chunk_worker.bundle.js b/src/chunk_worker.bundle.js index 159e988adc..a463171535 100644 --- a/src/chunk_worker.bundle.js +++ b/src/chunk_worker.bundle.js @@ -1,11 +1,14 @@ // Note: This file uses ".js" rather than ".ts" extension because we cannot rely // on Node.js subpath imports to translate paths for Workers since those paths // must be valid for use in `new URL` with multiple bundlers. +import "#src/util/polyfills.js"; import "#src/shared_watchable_value.js"; import "#src/chunk_manager/backend.js"; +import "#src/kvstore/backend.js"; import "#src/sliceview/backend.js"; import "#src/perspective_view/backend.js"; import "#src/volume_rendering/backend.js"; import "#src/annotation/backend.js"; import "#src/datasource/enabled_backend_modules.js"; +import "#src/kvstore/enabled_backend_modules.js"; import "#src/worker_rpc_context.js"; diff --git a/src/coordinate_transform.ts b/src/coordinate_transform.ts index 99a9fdc07c..2b2a2fd09f 100644 --- a/src/coordinate_transform.ts +++ b/src/coordinate_transform.ts @@ -1414,7 +1414,7 @@ export class CoordinateSpaceCombiner { private retainCount = 0; - private prevCombined: CoordinateSpace | undefined = this.combined.value; + private prevCombined: CoordinateSpace | undefined; dimensionRefCounts = new Map(); @@ -1454,6 +1454,7 @@ export class CoordinateSpaceCombiner { includeDimensionPredicate: (name: string) => boolean, ) { this.includeDimensionPredicate_ = includeDimensionPredicate; + this.prevCombined = this.combined.value; } private update() { diff --git a/src/credentials_provider/chunk_source_frontend.ts b/src/credentials_provider/chunk_source_frontend.ts index e0dfb35a36..5f7a07cce0 100644 --- a/src/credentials_provider/chunk_source_frontend.ts +++ b/src/credentials_provider/chunk_source_frontend.ts @@ -69,7 +69,7 @@ export function WithCredentialsProvider() { }; class C extends Base { credentialsProvider: MaybeOptionalCredentialsProvider; - OPTIONS: WithCredentialsOptions; + declare OPTIONS: WithCredentialsOptions; constructor(...args: any[]) { super(...args); const options: WithCredentialsOptions = args[1]; diff --git a/src/credentials_provider/default_manager.ts b/src/credentials_provider/default_manager.ts index dea60b764c..c95fb6a874 100644 --- a/src/credentials_provider/default_manager.ts +++ b/src/credentials_provider/default_manager.ts @@ -18,7 +18,23 @@ * @file CredentialsManager for globally registering a CredentialsProvider */ -import { CachingMapBasedCredentialsManager } from "#src/credentials_provider/index.js"; +import { + CachingMapBasedCredentialsManager, + type ProviderGetter, +} from "#src/credentials_provider/index.js"; -export const defaultCredentialsManager = - new CachingMapBasedCredentialsManager(); +const providers = new Map>(); +export function registerDefaultCredentialsProvider( + key: string, + providerGetter: ProviderGetter, +) { + providers.set(key, providerGetter); +} + +export function getDefaultCredentialsManager() { + const manager = new CachingMapBasedCredentialsManager(); + for (const [key, provider] of providers) { + manager.register(key, provider); + } + return manager; +} diff --git a/src/credentials_provider/http_request.ts b/src/credentials_provider/http_request.ts index 825dd5b705..bdf8bec3f0 100644 --- a/src/credentials_provider/http_request.ts +++ b/src/credentials_provider/http_request.ts @@ -18,32 +18,25 @@ import type { CredentialsProvider, CredentialsWithGeneration, } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { throwIfCanceled, uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { - cancellableFetchOk, - HttpError, - pickDelay, -} from "#src/util/http_request.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk, HttpError, pickDelay } from "#src/util/http_request.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; const maxCredentialsAttempts = 3; -export async function fetchWithCredentials( +export async function fetchOkWithCredentials( credentialsProvider: CredentialsProvider, input: RequestInfo | ((credentials: Credentials) => RequestInfo), - init: RequestInit, - transformResponse: ResponseTransform, + init: RequestInit & { progressListener?: ProgressListener }, applyCredentials: ( credentials: Credentials, - requestInit: RequestInit, - ) => RequestInit, + requestInit: RequestInit & { progressListener?: ProgressListener }, + ) => RequestInit & { progressListener?: ProgressListener }, errorHandler: (httpError: HttpError, credentials: Credentials) => "refresh", - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { let credentials: CredentialsWithGeneration | undefined; for (let credentialsAttempt = 0; ; ) { - throwIfCanceled(cancellationToken); + init.signal?.throwIfAborted(); if (credentialsAttempt > 1) { // Don't delay on the first attempt, and also don't delay on the second attempt, since if the // credentials have expired and there is no problem on the server there is no reason to delay @@ -52,13 +45,14 @@ export async function fetchWithCredentials( setTimeout(resolve, pickDelay(credentialsAttempt - 2)), ); } - credentials = await credentialsProvider.get(credentials, cancellationToken); + credentials = await credentialsProvider.get(credentials, { + signal: init.signal ?? undefined, + progressListener: init.progressListener, + }); try { - return await cancellableFetchOk( + return await fetchOk( typeof input === "function" ? input(credentials.credentials) : input, applyCredentials(credentials.credentials, init), - transformResponse, - cancellationToken, ); } catch (error) { if (error instanceof HttpError) { @@ -71,3 +65,21 @@ export async function fetchWithCredentials( } } } + +export function fetchOkWithCredentialsAdapter( + credentialsProvider: CredentialsProvider, + applyCredentials: ( + credentials: Credentials, + requestInit: RequestInit & { progressListener?: ProgressListener }, + ) => RequestInit & { progressListener?: ProgressListener }, + errorHandler: (httpError: HttpError, credentials: Credentials) => "refresh", +): FetchOk { + return (input, init = {}) => + fetchOkWithCredentials( + credentialsProvider, + input, + init, + applyCredentials, + errorHandler, + ); +} diff --git a/src/credentials_provider/index.ts b/src/credentials_provider/index.ts index c0aab02d6f..1290e24036 100644 --- a/src/credentials_provider/index.ts +++ b/src/credentials_provider/index.ts @@ -18,11 +18,11 @@ * @file Generic facility for providing authentication/authorization credentials. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { MultipleConsumerCancellationTokenSource } from "#src/util/cancellation.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; -import { StringMemoize } from "#src/util/memoize.js"; +import type { AsyncMemoizeWithProgress } from "#src/util/memoize.js"; +import { asyncMemoizeWithProgress, StringMemoize } from "#src/util/memoize.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** * Wraps an arbitrary JSON credentials object with a generation number. @@ -43,70 +43,50 @@ export abstract class CredentialsProvider extends RefCounted { */ abstract get: ( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + options?: Partial, ) => Promise>; } export function makeCachedCredentialsGetter( getUncached: ( invalidCredentials: CredentialsWithGeneration | undefined, - cancellationToken: CancellationToken, + options: ProgressOptions, ) => Promise>, ) { let cachedCredentials: CredentialsWithGeneration | undefined; let pendingCredentials: - | Promise> + | AsyncMemoizeWithProgress> | undefined; - let pendingCancellationToken: - | MultipleConsumerCancellationTokenSource - | undefined; - return ( + return async ( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + options?: Partial, ) => { + // Check if a new credential request needs to be made. if ( - pendingCredentials !== undefined && - (cachedCredentials === undefined || - invalidCredentials === undefined || - cachedCredentials.generation !== invalidCredentials.generation) + pendingCredentials === undefined || + (invalidCredentials !== undefined && + cachedCredentials?.generation === invalidCredentials.generation) ) { - if (cachedCredentials === undefined) { - pendingCancellationToken!.addConsumer(cancellationToken); - } - return pendingCredentials; + cachedCredentials = undefined; + pendingCredentials = asyncMemoizeWithProgress(async (progressOptions) => { + cachedCredentials = await getUncached( + invalidCredentials, + progressOptions, + ); + return cachedCredentials; + }); } - cachedCredentials = undefined; - pendingCancellationToken = new MultipleConsumerCancellationTokenSource(); - pendingCredentials = getUncached( - invalidCredentials, - pendingCancellationToken, - ).then( - (credentials) => { - cachedCredentials = credentials; - pendingCancellationToken = undefined; - return credentials; - }, - (reason) => { - if (pendingCancellationToken!.isCanceled) { - pendingCancellationToken = undefined; - pendingCredentials = undefined; - } - throw reason; - }, - ); - return pendingCredentials; + return pendingCredentials(options ?? {}); }; } export function makeCredentialsGetter( - getWithoutGeneration: ( - cancellationToken: CancellationToken, - ) => Promise, + getWithoutGeneration: (options: ProgressOptions) => Promise, ) { let generation = 0; return makeCachedCredentialsGetter( - (_invalidCredentials, cancellationToken) => - getWithoutGeneration(cancellationToken).then((credentials) => ({ + (_invalidCredentials, options) => + getWithoutGeneration(options).then((credentials) => ({ generation: ++generation, credentials, })), @@ -132,13 +112,7 @@ export type ProviderGetter = ( * CredentialsManager that supports registration. */ export class MapBasedCredentialsManager implements CredentialsManager { - providers = new Map< - string, - ( - parameters: any, - credentialsManager: CredentialsManager, - ) => Owned> - >(); + providers = new Map>(); topLevelManager: CredentialsManager = this; register( key: string, @@ -216,7 +190,10 @@ export class AnonymousFirstCredentialsProvider< } get = makeCachedCredentialsGetter( - (invalidCredentials?: CredentialsWithGeneration) => { + ( + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, + ) => { if (this.anonymous && invalidCredentials === undefined) { return Promise.resolve({ generation: -10, @@ -224,7 +201,7 @@ export class AnonymousFirstCredentialsProvider< }); } this.anonymous = false; - return this.baseProvider.get(invalidCredentials); + return this.baseProvider.get(invalidCredentials, options); }, ); } diff --git a/src/credentials_provider/interactive_credentials_provider.ts b/src/credentials_provider/interactive_credentials_provider.ts new file mode 100644 index 0000000000..216b64bf9a --- /dev/null +++ b/src/credentials_provider/interactive_credentials_provider.ts @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { StatusMessage } from "#src/status.js"; +import { scopedAbortCallback } from "#src/util/abort.js"; + +export function getCredentialsWithStatus( + options: { + description: string; + requestDescription?: string; + supportsImmediate?: boolean; + get: (signal: AbortSignal, immediate: boolean) => Promise; + }, + signal: AbortSignal, +): Promise { + const { requestDescription = "login" } = options; + const status = new StatusMessage(/*delay=*/ true); + let abortController: AbortController | undefined; + return new Promise((resolve, reject) => { + const disposeAbortCallback = scopedAbortCallback(signal, (reason) => { + abortController?.abort(reason); + abortController = undefined; + status.dispose(); + reject(reason); + }); + function dispose() { + if (abortController === undefined) return; + abortController = undefined; + status.dispose(); + disposeAbortCallback?.[Symbol.dispose](); + } + function writeLoginStatus( + msg = `${options.description} ${requestDescription} required.`, + linkMessage = `Request ${requestDescription}.`, + ) { + status.setText(msg + " "); + const button = document.createElement("button"); + button.textContent = linkMessage; + status.element.appendChild(button); + button.addEventListener("click", () => { + login(/*immediate=*/ false); + }); + } + function login(immediate: boolean) { + abortController?.abort(); + abortController = new AbortController(); + writeLoginStatus( + `Waiting for ${options.description} ${requestDescription}...`, + "Retry", + ); + options.get(abortController.signal, immediate).then( + (token) => { + dispose(); + resolve(token); + }, + (reason) => { + if (abortController === undefined) { + // Already completed, ignore. + return; + } + abortController = undefined; + status.setVisible(true); + status.setModal(true); + if (immediate) { + writeLoginStatus(); + } else { + writeLoginStatus( + `${options.description} ${requestDescription} failed: ${reason}.`, + "Retry", + ); + } + }, + ); + } + if (options.supportsImmediate === true) { + login(/*immediate=*/ true); + } else { + writeLoginStatus(); + status.setVisible(true); + status.setModal(true); + } + }); +} + +export class AuthWindowClosedError extends Error { + constructor() { + super("Authentication window was closed"); + } +} + +export function monitorAuthPopupWindow( + popup: Window, + abortController: AbortController, +) { + window.addEventListener( + "beforeunload", + () => { + popup.close(); + }, + { signal: abortController.signal }, + ); + const checkClosed = setInterval(() => { + if (popup.closed) { + abortController.abort(new AuthWindowClosedError()); + } + }, 1000); + abortController.signal.addEventListener("abort", () => { + try { + popup.close(); + } catch { + // Ignore error closing window. + } + clearInterval(checkClosed); + }); +} diff --git a/src/credentials_provider/oauth2.ts b/src/credentials_provider/oauth2.ts index 444b5fd95a..3fee4084fa 100644 --- a/src/credentials_provider/oauth2.ts +++ b/src/credentials_provider/oauth2.ts @@ -14,12 +14,13 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { + fetchOkWithCredentials, + fetchOkWithCredentialsAdapter, +} from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import type { FetchOk, HttpError } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; /** * OAuth2 token @@ -30,52 +31,64 @@ export interface OAuth2Credentials { email?: string; } -export function fetchWithOAuth2Credentials( +function applyCredentials( + credentials: OAuth2Credentials, + init: RequestInit, +): RequestInit { + if (!credentials.accessToken) return init; + const headers = new Headers(init.headers); + headers.set( + "Authorization", + `${credentials.tokenType} ${credentials.accessToken}`, + ); + return { ...init, headers }; +} + +function errorHandler( + error: HttpError, + credentials: OAuth2Credentials, +): "refresh" { + const { status } = error; + if (status === 401) { + // 401: Authorization needed. OAuth2 token may have expired. + return "refresh"; + } + if (status === 403 && !credentials.accessToken) { + // Anonymous access denied. Request credentials. + return "refresh"; + } + if (error instanceof Error && credentials.email !== undefined) { + error.message += ` (Using credentials for ${JSON.stringify( + credentials.email, + )})`; + } + throw error; +} + +export function fetchOkWithOAuth2Credentials( credentialsProvider: CredentialsProvider | undefined, input: RequestInfo, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { +): Promise { if (credentialsProvider === undefined) { - return cancellableFetchOk( - input, - init, - transformResponse, - cancellationToken, - ); + return fetchOk(input, init); } - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, input, init, - transformResponse, - (credentials, init) => { - if (!credentials.accessToken) return init; - const headers = new Headers(init.headers); - headers.set( - "Authorization", - `${credentials.tokenType} ${credentials.accessToken}`, - ); - return { ...init, headers }; - }, - (error, credentials) => { - const { status } = error; - if (status === 401) { - // 401: Authorization needed. OAuth2 token may have expired. - return "refresh"; - } - if (status === 403 && !credentials.accessToken) { - // Anonymous access denied. Request credentials. - return "refresh"; - } - if (error instanceof Error && credentials.email !== undefined) { - error.message += ` (Using credentials for ${JSON.stringify( - credentials.email, - )})`; - } - throw error; - }, - cancellationToken, + applyCredentials, + errorHandler, + ); +} + +export function fetchOkWithOAuth2CredentialsAdapter( + credentialsProvider: CredentialsProvider | undefined, +): FetchOk { + if (credentialsProvider === undefined) return fetchOk; + return fetchOkWithCredentialsAdapter( + credentialsProvider, + applyCredentials, + errorHandler, ); } diff --git a/src/credentials_provider/shared.ts b/src/credentials_provider/shared.ts index 60308ec9e6..60153312f9 100644 --- a/src/credentials_provider/shared.ts +++ b/src/credentials_provider/shared.ts @@ -19,15 +19,18 @@ */ import type { + CredentialsManager, CredentialsProvider, CredentialsWithGeneration, } from "#src/credentials_provider/index.js"; import { CREDENTIALS_PROVIDER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, + CREDENTIALS_MANAGER_RPC_ID, + CREDENTIALS_MANAGER_GET_RPC_ID, } from "#src/credentials_provider/shared_common.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Owned } from "#src/util/disposable.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import type { RPC, RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, @@ -51,9 +54,9 @@ export class SharedCredentialsProvider get( invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + options?: Partial, ): Promise> { - return this.provider.get(invalidCredentials, cancellationToken); + return this.provider.get(invalidCredentials, options); } } @@ -62,13 +65,53 @@ registerPromiseRPC( function ( this: RPC, x: { providerId: number; invalidCredentials: any }, - cancellationToken: CancellationToken, + progressOptions, ): RPCPromise> { const obj = >this.get(x.providerId); return obj - .get(x.invalidCredentials, cancellationToken) + .get(x.invalidCredentials, progressOptions) .then((credentials) => ({ value: credentials, })); }, ); + +@registerSharedObjectOwner(CREDENTIALS_MANAGER_RPC_ID) +export class SharedCredentialsManager + extends SharedObject + implements CredentialsManager +{ + constructor( + public base: CredentialsManager, + rpc: RPC, + ) { + super(); + this.initializeCounterpart(rpc); + } + + getCredentialsProvider(key: string, parameters?: any) { + return this.base.getCredentialsProvider(key, parameters); + } +} + +registerPromiseRPC( + CREDENTIALS_MANAGER_GET_RPC_ID, + async function ( + this: RPC, + x: { + managerId: number; + key: string; + parameters: any; + invalidCredentials: any; + }, + progressOptions, + ): RPCPromise> { + const manager = this.get(x.managerId) as SharedCredentialsManager; + const provider = manager.base.getCredentialsProvider(x.key, x.parameters); + const credentials = await provider.get( + x.invalidCredentials, + progressOptions, + ); + return { value: credentials }; + }, +); diff --git a/src/credentials_provider/shared_common.ts b/src/credentials_provider/shared_common.ts index a9b435cc9a..ce47289b67 100644 --- a/src/credentials_provider/shared_common.ts +++ b/src/credentials_provider/shared_common.ts @@ -16,3 +16,5 @@ export const CREDENTIALS_PROVIDER_RPC_ID = "CredentialsProvider"; export const CREDENTIALS_PROVIDER_GET_RPC_ID = "CredentialsProvider.get"; +export const CREDENTIALS_MANAGER_RPC_ID = "CredentialsManager"; +export const CREDENTIALS_MANAGER_GET_RPC_ID = "CredentialsManager.get"; diff --git a/src/credentials_provider/shared_counterpart.ts b/src/credentials_provider/shared_counterpart.ts index 7a9910977b..c9ca969bca 100644 --- a/src/credentials_provider/shared_counterpart.ts +++ b/src/credentials_provider/shared_counterpart.ts @@ -20,16 +20,23 @@ */ import type { - CredentialsProvider, + CredentialsManager, CredentialsWithGeneration, MaybeOptionalCredentialsProvider, } from "#src/credentials_provider/index.js"; -import { makeCachedCredentialsGetter } from "#src/credentials_provider/index.js"; import { + CachingCredentialsManager, + makeCachedCredentialsGetter, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import { + CREDENTIALS_MANAGER_GET_RPC_ID, + CREDENTIALS_MANAGER_RPC_ID, CREDENTIALS_PROVIDER_GET_RPC_ID, CREDENTIALS_PROVIDER_RPC_ID, } from "#src/credentials_provider/shared_common.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import type { RPC } from "#src/worker_rpc.js"; import { registerSharedObject, SharedObjectCounterpart, @@ -42,13 +49,13 @@ export class SharedCredentialsProviderCounterpart { get = makeCachedCredentialsGetter( ( - invalidCredentials?: CredentialsWithGeneration, - cancellationToken?: CancellationToken, + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, ): Promise> => this.rpc!.promiseInvoke( CREDENTIALS_PROVIDER_GET_RPC_ID, { providerId: this.rpcId, invalidCredentials: invalidCredentials }, - cancellationToken, + { signal: options.signal, progressListener: options.progressListener }, ), ); } @@ -68,3 +75,57 @@ export function WithSharedCredentialsProviderCounterpart() { } }; } + +class ProxyCredentialsProvider< + Credentials, +> extends CredentialsProvider { + constructor( + public rpc: RPC, + public managerId: number, + public key: string, + public parameters?: any, + ) { + super(); + } + get = makeCachedCredentialsGetter( + ( + invalidCredentials: CredentialsWithGeneration | undefined, + options: ProgressOptions, + ): Promise> => + this.rpc.promiseInvoke( + CREDENTIALS_MANAGER_GET_RPC_ID, + { + managerId: this.managerId, + key: this.key, + parameters: this.parameters, + invalidCredentials: invalidCredentials, + }, + { signal: options.signal, progressListener: options.progressListener }, + ), + ); +} + +@registerSharedObject(CREDENTIALS_MANAGER_RPC_ID) +export class SharedCredentialsManagerCounterpart + extends SharedObjectCounterpart + implements CredentialsManager +{ + private impl: CachingCredentialsManager = + new CachingCredentialsManager(this.makeBaseCredentialsManager()); + + private makeBaseCredentialsManager(): CredentialsManager { + return { + getCredentialsProvider: (key: string, parameters?: any) => + new ProxyCredentialsProvider( + this.rpc!, + this.rpcId!, + key, + parameters, + ), + }; + } + + getCredentialsProvider(key: string, parameters?: any) { + return this.impl.getCredentialsProvider(key, parameters); + } +} diff --git a/src/data_management_context.ts b/src/data_management_context.ts new file mode 100644 index 0000000000..d55274c81a --- /dev/null +++ b/src/data_management_context.ts @@ -0,0 +1,79 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; +import { + CapacitySpecification, + ChunkManager, + ChunkQueueManager, +} from "#src/chunk_manager/frontend.js"; +import { RefCounted } from "#src/util/disposable.js"; +import type { GL } from "#src/webgl/context.js"; +import { RPC } from "#src/worker_rpc.js"; + +export class DataManagementContext extends RefCounted { + worker: Worker; + chunkQueueManager: ChunkQueueManager; + chunkManager: ChunkManager; + + get rpc(): RPC { + return this.chunkQueueManager.rpc!; + } + + constructor( + public gl: GL, + public frameNumberCounter: FrameNumberCounter, + ) { + super(); + // Note: For compatibility with multiple bundlers, a browser-compatible URL + // must be used with `new URL`, which means a Node.js subpath import like + // "#src/chunk_worker.bundle.js" cannot be used. + this.worker = new Worker( + /* webpackChunkName: "neuroglancer_chunk_worker" */ + new URL("./chunk_worker.bundle.js", import.meta.url), + { type: "module" }, + ); + this.chunkQueueManager = this.registerDisposer( + new ChunkQueueManager( + new RPC(this.worker, /*waitUntilReady=*/ true), + this.gl, + this.frameNumberCounter, + { + gpuMemory: new CapacitySpecification({ + defaultItemLimit: 1e6, + defaultSizeLimit: 1e9, + }), + systemMemory: new CapacitySpecification({ + defaultItemLimit: 1e7, + defaultSizeLimit: 2e9, + }), + download: new CapacitySpecification({ + defaultItemLimit: 100, + defaultSizeLimit: Number.POSITIVE_INFINITY, + }), + compute: new CapacitySpecification({ + defaultItemLimit: 128, + defaultSizeLimit: 5e8, + }), + }, + ), + ); + this.chunkQueueManager.registerDisposer(() => this.worker.terminate()); + this.chunkManager = this.registerDisposer( + new ChunkManager(this.chunkQueueManager), + ); + } +} diff --git a/src/data_panel_layout.ts b/src/data_panel_layout.ts index 7154a5785b..fda6f00101 100644 --- a/src/data_panel_layout.ts +++ b/src/data_panel_layout.ts @@ -119,6 +119,7 @@ const oneSquareSymbol = "â—»"; const LAYOUT_SYMBOLS = new Map([ ["4panel", "â—±"], + ["4panel-alt", "â—²"], ["3d", oneSquareSymbol], ]); @@ -403,7 +404,7 @@ export class FourPanelLayout extends RefCounted { } addDisplayDimensionsWidget(this, panel); addUnconditionalSliceViews(viewer, panel, crossSections); - registerRelatedLayouts(this, panel, ["3d"]); + registerRelatedLayouts(this, panel, ["3d", "4panel-alt"]); }), L.withFlex(1, (element) => { makeSliceViewPanel( @@ -427,6 +428,109 @@ export class FourPanelLayout extends RefCounted { } } +export class FourPanelAltLayout extends RefCounted { + constructor( + public container: DataPanelLayoutContainer, + public rootElement: HTMLElement, + public viewer: ViewerUIState, + crossSections: Borrowed, + ) { + super(); + + const sliceViews = makeOrthogonalSliceViews(viewer); + const { display } = viewer; + + const perspectiveViewerState = { + ...getCommonPerspectiveViewerState(container), + showSliceViews: viewer.showPerspectiveSliceViews, + showSliceViewsCheckbox: true, + }; + + const sliceViewerState = { + ...getCommonSliceViewerState(viewer), + showScaleBar: viewer.showScaleBar, + }; + + const sliceViewerStateWithoutScaleBar = { + ...getCommonSliceViewerState(viewer), + showScaleBar: new TrackableBoolean(false, false), + }; + + const makeSliceViewPanel = ( + axes: NamedAxes, + element: HTMLElement, + state: SliceViewerState, + displayDimensionsWidget: boolean, + ) => { + const panel = this.registerDisposer( + new SliceViewPanel(display, element, sliceViews.get(axes)!, state), + ); + if (displayDimensionsWidget) { + addDisplayDimensionsWidget(this, panel); + } + registerRelatedLayouts(this, panel, [axes, `${axes}-3d`]); + return panel; + }; + const mainDisplayContents = [ + L.withFlex( + 1, + L.box("column", [ + L.withFlex( + 1, + L.box("row", [ + L.withFlex(1, (element) => { + makeSliceViewPanel("xy", element, sliceViewerState, true); + }), + L.withFlex(1, (element) => { + makeSliceViewPanel( + "yz", + element, + sliceViewerStateWithoutScaleBar, + false, + ); + }), + ]), + ), + L.withFlex( + 1, + L.box("row", [ + L.withFlex(1, (element) => { + makeSliceViewPanel( + "xz", + element, + sliceViewerStateWithoutScaleBar, + false, + ); + }), + L.withFlex(1, (element) => { + const panel = this.registerDisposer( + new PerspectivePanel( + display, + element, + perspectiveViewerState, + ), + ); + for (const sliceView of sliceViews.values()) { + panel.sliceViews.set(sliceView.addRef(), false); + } + addDisplayDimensionsWidget(this, panel); + addUnconditionalSliceViews(viewer, panel, crossSections); + registerRelatedLayouts(this, panel, ["3d", "4panel"]); + }), + ]), + ), + ]), + ), + ]; + L.box("row", mainDisplayContents)(rootElement); + } + + disposed() { + removeChildren(this.rootElement); + super.disposed(); + } +} + export class SliceViewPerspectiveTwoPanelLayout extends RefCounted { constructor( public container: DataPanelLayoutContainer, @@ -460,7 +564,7 @@ export class SliceViewPerspectiveTwoPanelLayout extends RefCounted { new SliceViewPanel(display, element, sliceView, sliceViewerState), ); addDisplayDimensionsWidget(this, panel); - registerRelatedLayouts(this, panel, [axes, "4panel"]); + registerRelatedLayouts(this, panel, [axes, "4panel-alt"]); }), L.withFlex(1, (element) => { const panel = this.registerDisposer( @@ -469,7 +573,7 @@ export class SliceViewPerspectiveTwoPanelLayout extends RefCounted { panel.sliceViews.set(sliceView.addRef(), false); addUnconditionalSliceViews(viewer, panel, crossSections); addDisplayDimensionsWidget(this, panel); - registerRelatedLayouts(this, panel, ["3d", "4panel"]); + registerRelatedLayouts(this, panel, ["3d", "4panel-alt"]); }), ]), )(rootElement); @@ -506,7 +610,7 @@ export class SinglePanelLayout extends RefCounted { ), ); addDisplayDimensionsWidget(this, panel); - registerRelatedLayouts(this, panel, ["4panel", `${axes}-3d`]); + registerRelatedLayouts(this, panel, ["4panel-alt", `${axes}-3d`]); }), ])(rootElement); } @@ -537,7 +641,7 @@ export class SinglePerspectiveLayout extends RefCounted { ); addUnconditionalSliceViews(viewer, panel, crossSections); addDisplayDimensionsWidget(this, panel); - registerRelatedLayouts(this, panel, ["4panel"]); + registerRelatedLayouts(this, panel, ["4panel-alt"]); }), ])(rootElement); } @@ -566,6 +670,13 @@ export const LAYOUTS = new Map< new FourPanelLayout(container, element, viewer, crossSections), }, ], + [ + "4panel-alt", + { + factory: (container, element, viewer, crossSections) => + new FourPanelAltLayout(container, element, viewer, crossSections), + }, + ], [ "3d", { diff --git a/src/datasource/boss/api.ts b/src/datasource/boss/api.ts index 71b3a3e88d..8ca9ff6817 100644 --- a/src/datasource/boss/api.ts +++ b/src/datasource/boss/api.ts @@ -14,12 +14,9 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; export type BossToken = string; @@ -28,19 +25,12 @@ export type BossToken = string; */ export const credentialsKey = "boss"; -export function fetchWithBossCredentials( +export async function fetchWithBossCredentials( credentialsProvider: CredentialsProvider, input: RequestInfo, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - return cancellableFetchOk( - input, - init, - transformResponse, - cancellationToken, - ).catch((error) => { +): Promise { + return fetchOk(input, init).catch((error) => { if ( error.status !== 500 && error.status !== 401 && @@ -51,11 +41,10 @@ export function fetchWithBossCredentials( // has been cancelled throw error; } - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, input, init, - transformResponse, (credentials) => { const headers = new Headers(init.headers); headers.set("Authorization", `Bearer ${credentials}`); @@ -69,7 +58,6 @@ export function fetchWithBossCredentials( } throw error; }, - cancellationToken, ); }); } diff --git a/src/datasource/boss/backend.ts b/src/datasource/boss/backend.ts index 58d6cd40f6..fba370af85 100644 --- a/src/datasource/boss/backend.ts +++ b/src/datasource/boss/backend.ts @@ -35,12 +35,7 @@ import type { ChunkDecoder } from "#src/sliceview/backend_chunk_decoders/index.j import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; import type { SharedObject } from "#src/worker_rpc.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @@ -72,7 +67,7 @@ export class BossVolumeChunkSource extends BossSource( ) { chunkDecoder = chunkDecoders.get(this.parameters.encoding)!; - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; let url = `${parameters.baseUrl}/latest/cutout/${parameters.collection}/${parameters.experiment}/${parameters.channel}/${parameters.resolution}`; { @@ -92,11 +87,12 @@ export class BossVolumeChunkSource extends BossSource( const response = await fetchWithBossCredentials( this.credentialsProvider, url, - { headers: { Accept: acceptHeaders.get(parameters.encoding)! } }, - responseArrayBuffer, - cancellationToken, + { + signal: signal, + headers: { Accept: acceptHeaders.get(parameters.encoding)! }, + }, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -123,23 +119,25 @@ export class BossMeshSource extends BossSource( MeshSource, MeshSourceParameters, ) { - download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters } = this; - return cancellableFetchOk( + return fetchWithBossCredentials( + this.credentialsProvider, `${parameters.baseUrl}${chunk.objectId}`, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeManifestChunk(chunk, response)); + { signal: signal }, + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeManifestChunk(chunk, response)); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; - return cancellableFetchOk( + return fetchWithBossCredentials( + this.credentialsProvider, `${parameters.baseUrl}${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + { signal: signal }, + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } diff --git a/src/datasource/boss/credentials_provider.ts b/src/datasource/boss/credentials_provider.ts index cf75d9a030..0a05e79fcc 100644 --- a/src/datasource/boss/credentials_provider.ts +++ b/src/datasource/boss/credentials_provider.ts @@ -23,138 +23,125 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; -import { StatusMessage } from "#src/status.js"; import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { verifyObject, verifyString } from "#src/util/json.js"; + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; +import { raceWithAbort } from "#src/util/abort.js"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { getRandomHexString } from "#src/util/random.js"; -import { Signal } from "#src/util/signal.js"; export type BossToken = string; -class PendingRequest { - finished = new Signal<(token?: BossToken, error?: any) => void>(); +function makeAuthRequestUrl(options: { + authServer: string; + clientId: string; + redirect_uri: string; + state?: string; + nonce?: string; +}) { + let url = `${options.authServer}/realms/BOSS/protocol/openid-connect/auth?`; + url += `client_id=${encodeURIComponent(options.clientId)}`; + url += `&redirect_uri=${encodeURIComponent(options.redirect_uri)}`; + url += "&response_mode=fragment"; + url += "&response_type=code%20id_token%20token"; + if (options.state) { + url += `&state=${options.state}`; + } + if (options.nonce) { + url += `&nonce=${options.nonce}`; + } + return url; } -class AuthHandler { - oidcCallbackService = "bossAuthCallback"; - relayReadyPromise: Promise; - pendingRequests = new Map(); +function waitForAuthResponseMessage( + source: Window, + state: string, + signal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.origin !== location.origin) { + return; + } - constructor() { - this.registerListener(); - } + if (event.source !== source) return; - registerListener() { - addEventListener("message", (event: MessageEvent) => { - if (event.origin !== location.origin) { - // Ignore messages from different origins. - return; - } - try { - const data = verifyObject(JSON.parse(event.data)); - const service = verifyString(data.service); - if (service === this.oidcCallbackService) { - const accessToken = verifyString(data.access_token); - const state = verifyString(data.state); - const request = this.pendingRequests.get(state); - if (request === undefined) { - // Request may have been cancelled. - return; + try { + const obj = verifyObject(JSON.parse(event.data)); + if ( + verifyObjectProperty(obj, "service", verifyString) !== + "bossAuthCallback" + ) { + throw new Error("Unexpected service"); + } + const receivedState = verifyObjectProperty( + obj, + "state", + verifyString, + ); + if (receivedState !== state) { + throw new Error("invalid state"); } - request.finished.dispatch(accessToken); + const accessToken = verifyObjectProperty( + obj, + "access_token", + verifyString, + ); + resolve(accessToken); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); } - } catch (parseError) { - // Ignore invalid message. - } - }); - } - - addPendingRequest(state: string) { - const request = new PendingRequest(); - this.pendingRequests.set(state, request); - request.finished.add(() => { - this.pendingRequests.delete(state); - }); - return request; - } - - makeAuthRequestUrl(options: { - authServer: string; - clientId: string; - redirect_uri: string; - state?: string; - nonce?: string; - }) { - let url = `${options.authServer}/realms/BOSS/protocol/openid-connect/auth?`; - url += `client_id=${encodeURIComponent(options.clientId)}`; - url += `&redirect_uri=${encodeURIComponent(options.redirect_uri)}`; - url += "&response_mode=fragment"; - url += "&response_type=code%20id_token%20token"; - if (options.state) { - url += `&state=${options.state}`; - } - if (options.nonce) { - url += `&nonce=${options.nonce}`; - } - return url; - } -} - -let authHandlerInstance: AuthHandler; - -function authHandler() { - if (authHandlerInstance === undefined) { - authHandlerInstance = new AuthHandler(); - } - return authHandlerInstance; + }, + { signal: signal }, + ); + }); } /** * Obtain a Keycloak OIDC authentication token. * @return A Promise that resolves to an authentication token. */ -export function authenticateKeycloakOIDC( +export async function authenticateKeycloakOIDC( options: { realm: string; clientId: string; authServer: string }, - cancellationToken = uncancelableToken, -) { + signal: AbortSignal, +): Promise { const state = getRandomHexString(); const nonce = getRandomHexString(); - const handler = authHandler(); - const url = handler.makeAuthRequestUrl({ + const url = makeAuthRequestUrl({ state: state, clientId: options.clientId, redirect_uri: new URL("./bossauth.html", import.meta.url).href, authServer: options.authServer, nonce: nonce, }); - const request = handler.addPendingRequest(state); - const promise = new Promise((resolve, reject) => { - request.finished.add((token: string, error: string) => { - if (token !== undefined) { - resolve(token); - } else { - reject(error); - } - }); - }); - request.finished.add( - cancellationToken.add(() => { - request.finished.dispatch(undefined, CANCELED); - }), - ); - if (!cancellationToken.isCanceled) { + const abortController = new AbortController(); + signal = AbortSignal.any([abortController.signal, signal]); + try { const newWindow = open(url); - if (newWindow !== null) { - request.finished.add(() => { - newWindow.close(); - }); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(newWindow, state, abortController.signal), + signal, + ); + } finally { + abortController.abort(); } - return promise; } export class BossCredentialsProvider extends CredentialsProvider { @@ -162,64 +149,24 @@ export class BossCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter((cancellationToken) => { - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeLoginStatus( - msg = "Boss authorization required.", - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - login(); - }); - status.setVisible(true); - } - const authServer = this.authServer; - function login() { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeLoginStatus("Waiting for Boss authorization...", "Retry"); - authenticateKeycloakOIDC( - { realm: "boss", clientId: "endpoint", authServer: authServer }, - cancellationSource, - ).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - writeLoginStatus( - `Boss authorization failed: ${reason}.`, - "Retry", - ); - } - }, - ); - } - writeLoginStatus(); + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting Boss access token from ${this.authServer}`, }); + return await getCredentialsWithStatus( + { + description: "Boss", + get: (signal) => + authenticateKeycloakOIDC( + { + realm: "boss", + clientId: "endpoint", + authServer: this.authServer, + }, + signal, + ), + }, + options.signal, + ); }); } diff --git a/src/datasource/boss/frontend.ts b/src/datasource/boss/frontend.ts index 88ad19db0f..ae3cfee2da 100644 --- a/src/datasource/boss/frontend.ts +++ b/src/datasource/boss/frontend.ts @@ -46,8 +46,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { MeshSource } from "#src/mesh/frontend.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; @@ -66,7 +66,6 @@ import { getPrefixMatchesWithDescriptions, } from "#src/util/completion.js"; import { vec2, vec3 } from "#src/util/geom.js"; -import { responseJson } from "#src/util/http_request.js"; import { parseArray, parseQueryStringParameters, @@ -82,6 +81,7 @@ import { verifyOptionalString, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; class BossVolumeChunkSource extends WithParameters( WithCredentialsProvider()(VolumeChunkSource), @@ -250,6 +250,7 @@ function parseExperimentInfo( credentialsProvider: CredentialsProvider, collection: string, experiment: string, + options: Partial, ): Promise { verifyObject(obj); @@ -262,6 +263,7 @@ function parseExperimentInfo( experiment, collection, ch, + options, ), ), ); @@ -291,6 +293,7 @@ function parseExperimentInfo( hostname, credentialsProvider, experimentInfo, + options, ); }); } @@ -501,30 +504,34 @@ export function getExperimentInfo( credentialsProvider: CredentialsProvider, experiment: string, collection: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, experiment: experiment, type: "boss:getExperimentInfo", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/`, - {}, - responseJson, - ).then((value) => - parseExperimentInfo( - value, - chunkManager, - hostname, - credentialsProvider, - collection, - experiment, + progressOptions, + ) + .then((response) => response.json()) + .then((value) => + parseExperimentInfo( + value, + chunkManager, + hostname, + credentialsProvider, + collection, + experiment, + progressOptions, + ), ), - ), ); } @@ -535,8 +542,9 @@ export function getChannelInfo( experiment: string, collection: string, channel: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, @@ -544,13 +552,15 @@ export function getChannelInfo( channel: channel, type: "boss:getChannelInfo", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/${experiment}/channel/${channel}/`, - {}, - responseJson, - ).then(parseChannelInfo), + progressOptions, + ) + .then((response) => response.json()) + .then(parseChannelInfo), ); } @@ -561,9 +571,10 @@ export function getDownsampleInfoForChannel( collection: string, experimentInfo: ExperimentInfo, channel: string, + options: Partial, ): Promise { return chunkManager.memoize - .getUncounted( + .getAsync( { hostname: hostname, collection: collection, @@ -572,13 +583,13 @@ export function getDownsampleInfoForChannel( downsample: true, type: "boss:getDownsampleInfoForChannel", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/downsample/${collection}/${experimentInfo.key}/${channel}`, - {}, - responseJson, - ), + progressOptions, + ).then((response) => response.json()), ) .then((downsampleObj) => { return parseDownsampleInfoForChannel( @@ -660,6 +671,7 @@ export function getDataSource( hostname: string, credentialsProvider: CredentialsProvider, path: string, + options: Partial, ) { const match = path.match(pathPattern); if (match === null) { @@ -670,15 +682,17 @@ export function getDataSource( const channel = match[3]; const parameters = parseQueryStringParameters(match[4] || ""); // Warning: If additional arguments are added, the cache key should be updated as well. - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, path: path, type: "boss:getVolume" }, - async () => { + options, + async (progressOptions) => { const experimentInfo = await getExperimentInfo( chunkManager, hostname, credentialsProvider, experiment, collection, + progressOptions, ); const experimentInfoWithDownsample = await getDownsampleInfoForChannel( chunkManager, @@ -687,6 +701,7 @@ export function getDataSource( collection, experimentInfo, channel, + progressOptions, ); const volume = new BossMultiscaleVolumeChunkSource( chunkManager, @@ -739,20 +754,23 @@ export function getCollections( chunkManager: ChunkManager, hostname: string, credentialsProvider: CredentialsProvider, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, type: "boss:getCollections" }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/`, - {}, - responseJson, - ).then((value) => - verifyObjectProperty(value, "collections", (x) => - parseArray(x, verifyString), + progressOptions, + ) + .then((response) => response.json()) + .then((value) => + verifyObjectProperty(value, "collections", (x) => + parseArray(x, verifyString), + ), ), - ), ); } @@ -761,20 +779,23 @@ export function getExperiments( hostname: string, credentialsProvider: CredentialsProvider, collection: string, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, collection: collection, type: "boss:getExperiments" }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/collection/${collection}/experiment/`, - {}, - responseJson, - ).then((value) => - verifyObjectProperty(value, "experiments", (x) => - parseArray(x, verifyString), + progressOptions, + ) + .then((response) => response.json()) + .then((value) => + verifyObjectProperty(value, "experiments", (x) => + parseArray(x, verifyString), + ), ), - ), ); } @@ -783,24 +804,27 @@ export function getCoordinateFrame( hostname: string, credentialsProvider: CredentialsProvider, experimentInfo: ExperimentInfo, + options: Partial, ): Promise { const key = experimentInfo.coordFrameKey; - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { hostname: hostname, coordinateframe: key, experimentInfo: experimentInfo, type: "boss:getCoordinateFrame", }, - () => + options, + (progressOptions) => fetchWithBossCredentials( credentialsProvider, `${hostname}/latest/coord/${key}/`, - {}, - responseJson, - ).then((coordinateFrameObj) => - parseCoordinateFrame(coordinateFrameObj, experimentInfo), - ), + progressOptions, + ) + .then((response) => response.json()) + .then((coordinateFrameObj) => + parseCoordinateFrame(coordinateFrameObj, experimentInfo), + ), ); } @@ -809,6 +833,7 @@ export function collectionExperimentChannelCompleter( hostname: string, credentialsProvider: CredentialsProvider, path: string, + options: Partial, ): Promise { const channelMatch = path.match( /^(?:([^/]+)(?:\/?([^/]*)(?:\/?([^/]*)(?:\/?([^/]*)?))?)?)?$/, @@ -824,19 +849,22 @@ export function collectionExperimentChannelCompleter( if (channelMatch[2] === undefined) { const collectionPrefix = channelMatch[1] || ""; // Try to complete the collection. - return getCollections(chunkManager, hostname, credentialsProvider).then( - (collections) => { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - collectionPrefix, - collections, - (x) => x + "/", - () => undefined, - ), - }; - }, - ); + return getCollections( + chunkManager, + hostname, + credentialsProvider, + options, + ).then((collections) => { + return { + offset: 0, + completions: getPrefixMatchesWithDescriptions( + collectionPrefix, + collections, + (x) => x + "/", + () => undefined, + ), + }; + }); } if (channelMatch[3] === undefined) { const experimentPrefix = channelMatch[2] || ""; @@ -845,6 +873,7 @@ export function collectionExperimentChannelCompleter( hostname, credentialsProvider, channelMatch[1], + options, ).then((experiments) => { return { offset: channelMatch![1].length + 1, @@ -863,6 +892,7 @@ export function collectionExperimentChannelCompleter( credentialsProvider, channelMatch[2], channelMatch[1], + options, ).then((experimentInfo) => { const completions = getPrefixMatchesWithDescriptions( channelMatch![3], @@ -890,18 +920,17 @@ function getAuthServer(endpoint: string): string { return authServer; } -export class BossDataSource extends DataSourceProvider { - constructor(public credentialsManager: CredentialsManager) { - super(); +export class BossDataSource implements DataSourceProvider { + get scheme() { + return "boss"; } - get description() { return "bossDB: Block & Object Storage System"; } - getCredentialsProvider(path: string) { + getCredentialsProvider(credentialsManager: CredentialsManager, path: string) { const authServer = getAuthServer(path); - return this.credentialsManager.getCredentialsProvider( + return credentialsManager.getCredentialsProvider( credentialsKey, authServer, ); @@ -915,13 +944,15 @@ export class BossDataSource extends DataSourceProvider { ); } const credentialsProvider = this.getCredentialsProvider( + options.registry.credentialsManager, options.providerUrl, ); return getDataSource( - options.chunkManager, + options.registry.chunkManager, match[1], credentialsProvider, match[2], + options, ); } @@ -932,13 +963,17 @@ export class BossDataSource extends DataSourceProvider { throw null; } const hostname = match[1]; - const credentialsProvider = this.getCredentialsProvider(match[1]); + const credentialsProvider = this.getCredentialsProvider( + options.registry.credentialsManager, + match[1], + ); const path = match[2]; const completions = await collectionExperimentChannelCompleter( - options.chunkManager, + options.registry.chunkManager, hostname, credentialsProvider, path, + options, ); return applyCompletionOffset(match![1].length + 1, completions); } diff --git a/src/datasource/boss/index.rst b/src/datasource/boss/index.rst new file mode 100644 index 0000000000..d93932bf3a --- /dev/null +++ b/src/datasource/boss/index.rst @@ -0,0 +1,14 @@ +.. _boss-datasource: + +BossDB +====== + +The BossDB :ref:`data service driver` enables Neuroglancer to +view `Brain Observatory Storage Service & Database (BossDB) +`__ datasets. + +URL syntax +---------- + +- :file:`boss://https://{host}/{project}/{experiment}/{channel}` +- :file:`boss://http://{host}/{project}/{experiment}/{channel}` diff --git a/src/datasource/boss/register_credentials_provider.ts b/src/datasource/boss/register_credentials_provider.ts index fcdbe1eeac..47ec688d32 100644 --- a/src/datasource/boss/register_credentials_provider.ts +++ b/src/datasource/boss/register_credentials_provider.ts @@ -14,11 +14,11 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/boss/api.js"; import { BossCredentialsProvider } from "#src/datasource/boss/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( credentialsKey, (authServer) => new BossCredentialsProvider(authServer), ); diff --git a/src/datasource/boss/register_default.ts b/src/datasource/boss/register_default.ts index 399f13a1a5..acdf432402 100644 --- a/src/datasource/boss/register_default.ts +++ b/src/datasource/boss/register_default.ts @@ -17,7 +17,4 @@ import { BossDataSource } from "#src/datasource/boss/frontend.js"; import { registerProvider } from "#src/datasource/default_provider.js"; -registerProvider( - "boss", - (options) => new BossDataSource(options.credentialsManager), -); +registerProvider(new BossDataSource()); diff --git a/src/datasource/brainmaps/api.ts b/src/datasource/brainmaps/api.ts index 4809b30b57..941e7ccffd 100644 --- a/src/datasource/brainmaps/api.ts +++ b/src/datasource/brainmaps/api.ts @@ -16,10 +16,8 @@ import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; +import { fetchOkWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import type { RequestInitWithProgress } from "#src/util/http_request.js"; export type { OAuth2Credentials }; @@ -96,36 +94,15 @@ export interface BatchMeshFragmentPayload { batches: BatchMeshFragment[]; } -export interface HttpCall { - method: "GET" | "POST"; - path: string; - payload?: string; -} - -export function makeRequest( - instance: BrainmapsInstance, - credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; -export function makeRequest( - instance: BrainmapsInstance, - credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - export function makeRequest( instance: BrainmapsInstance, credentialsProvider: BrainmapsCredentialsProvider, - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): any { - return fetchWithOAuth2Credentials( + path: string, + init: RequestInitWithProgress = {}, +): Promise { + return fetchOkWithOAuth2Credentials( credentialsProvider, - `${instance.serverUrl}${httpCall.path}`, - { method: httpCall.method, body: httpCall.payload }, - httpCall.responseType === "json" ? responseJson : responseArrayBuffer, - cancellationToken, + `${instance.serverUrl}${path}`, + init, ); } diff --git a/src/datasource/brainmaps/backend.ts b/src/datasource/brainmaps/backend.ts index 15f29e8a13..51e2de5061 100644 --- a/src/datasource/brainmaps/backend.ts +++ b/src/datasource/brainmaps/backend.ts @@ -79,7 +79,6 @@ import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { kInfinityVec, kZeroVec, vec3, vec3Key } from "#src/util/geom.js"; import { @@ -143,8 +142,6 @@ function BrainmapsSource< ); } -const tempUint64 = new Uint64(); - @registerSharedObject() export class BrainmapsVolumeChunkSource extends BrainmapsSource( VolumeChunkSource, @@ -178,7 +175,7 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( } } - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; // chunkPosition must not be captured, since it will be invalidated by the next call to @@ -201,15 +198,14 @@ export class BrainmapsVolumeChunkSource extends BrainmapsSource( const response = await makeRequest( parameters.instance, this.credentialsProvider, + path, { method: "POST", - payload: JSON.stringify(payload), - path, - responseType: "arraybuffer", + body: JSON.stringify(payload), + signal: signal, }, - cancellationToken, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -225,7 +221,7 @@ function getFragmentCorner( `Couldn't parse fragmentId ${fragmentId} as hex-encoded Uint64`, ); } - return decodeZIndexCompressed(id, xBits, yBits, zBits); + return decodeZIndexCompressed(id.toBigInt(), xBits, yBits, zBits); } interface BrainmapsMultiscaleManifestChunk extends MultiscaleManifestChunk { @@ -487,7 +483,7 @@ async function makeBatchMeshRequest( meshName: string; }, ids: Map, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise { const path = "/v1/objects/meshes:batch"; const batches: BatchMeshFragment[] = []; @@ -512,17 +508,13 @@ async function makeBatchMeshRequest( batches: batches, }; try { - return await makeRequest( - parameters.instance, - credentialsProvider, - { + return await ( + await makeRequest(parameters.instance, credentialsProvider, path, { method: "POST", - path, - payload: JSON.stringify(payload), - responseType: "arraybuffer", - }, - cancellationToken, - ); + body: JSON.stringify(payload), + signal: signal, + }) + ).arrayBuffer(); } finally { for (const [id, idData] of pendingIds) { ids.set(id, idData); @@ -544,32 +536,21 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( return ""; })(); - download( - chunk: BrainmapsMultiscaleManifestChunk, - cancellationToken: CancellationToken, - ) { + download(chunk: BrainmapsMultiscaleManifestChunk, signal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.info.lods[0].info.name}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "GET", - path, - responseType: "json", - }, - cancellationToken, - ).then((response) => decodeMultiscaleManifestChunk(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, path, { + signal: signal, + }) + .then((response) => response.json()) + .then((response) => decodeMultiscaleManifestChunk(chunk, response)); } - async downloadFragment( - chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, - ) { + async downloadFragment(chunk: MultiscaleFragmentChunk, signal: AbortSignal) { const { parameters } = this; const manifestChunk = @@ -608,7 +589,6 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( octree[chunkIndex * 5 + 2] / relativeBlockShape[2], ); const fragmentKey = encodeZIndexCompressed3d( - tempUint64, xBits, yBits, zBits, @@ -652,7 +632,7 @@ export class BrainmapsMultiscaleMeshSource extends BrainmapsSource( meshName, }, ids, - cancellationToken, + signal, ) .then((response) => { --requestsInProgress; @@ -783,29 +763,23 @@ export class BrainmapsMeshSource extends BrainmapsSource( return ""; })(); - download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters } = this; const path = `/v1/objects/${parameters.volumeId}/meshes/` + `${parameters.meshName}:listfragments?` + `object_id=${chunk.objectId}&return_supervoxel_ids=true` + this.listFragmentsParams; - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "GET", - path, - responseType: "json", - }, - cancellationToken, - ).then((response) => decodeManifestChunkWithSupervoxelIds(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, path, { + signal, + }) + .then((response) => response.json()) + .then((response) => + decodeManifestChunkWithSupervoxelIds(chunk, response), + ); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const ids = new Map(); @@ -822,7 +796,7 @@ export class BrainmapsMeshSource extends BrainmapsSource( credentialsProvider, parameters, ids, - cancellationToken, + signal, ); decodeBatchMeshResponse(response, (fragment) => { if (!ids.delete(fragment.fullKey)) { @@ -867,7 +841,7 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const payload: SkeletonPayload = { object_id: `${chunk.objectId}`, @@ -877,17 +851,13 @@ export class BrainmapsSkeletonSource extends BrainmapsSource( `/meshes/${parameters.meshName}` + "/skeleton:binary"; applyChangeStack(parameters.changeSpec, payload); - return makeRequest( - parameters.instance, - this.credentialsProvider, - { - method: "POST", - path, - payload: JSON.stringify(payload), - responseType: "arraybuffer", - }, - cancellationToken, - ).then((response) => decodeSkeletonChunk(chunk, response)); + return makeRequest(parameters.instance, this.credentialsProvider, path, { + method: "POST", + body: JSON.stringify(payload), + signal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => decodeSkeletonChunk(chunk, response)); } } @@ -1152,27 +1122,23 @@ export class BrainmapsAnnotationGeometryChunkSource extends BrainmapsSource( AnnotationGeometryChunkSourceBackend, AnnotationSpatialIndexSourceParameters, ) { - async download( - chunk: AnnotationGeometryChunk, - cancellationToken: CancellationToken, - ) { + async download(chunk: AnnotationGeometryChunk, signal: AbortSignal) { const { parameters } = this; return Promise.all( spatialAnnotationTypes.map((spatialAnnotationType) => makeRequest( parameters.instance, this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, { + signal, method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ + body: JSON.stringify({ type: spatialAnnotationType, ignore_payload: true, }), - responseType: "json", }, - cancellationToken, - ), + ).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); @@ -1188,7 +1154,7 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, _relationshipIndex: number, - cancellationToken: CancellationToken, + signal: AbortSignal, ) { const { parameters } = this; return Promise.all( @@ -1196,100 +1162,108 @@ export class BrainmapsAnnotationSource extends BrainmapsSource( makeRequest( parameters.instance, this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, { + signal, method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ + body: JSON.stringify({ type: spatialAnnotationType, object_labels: [chunk.objectId.toString()], ignore_payload: true, }), - responseType: "json", }, - cancellationToken, - ), + ).then((response) => response.json()), ), ).then((values) => { parseAnnotations(chunk, values); }); } - downloadMetadata( - chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, - ) { + downloadMetadata(chunk: AnnotationMetadataChunk, signal: AbortSignal) { const { parameters } = this; const id = chunk.key!; return makeRequest( parameters.instance, this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, { + signal, method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:get`, - payload: JSON.stringify({ + body: JSON.stringify({ type: getSpatialAnnotationTypeFromId(id), id: getFullSpatialAnnotationId(parameters, id), }), - responseType: "json", - }, - cancellationToken, - ).then( - (response) => { - chunk.annotation = parseAnnotationResponse( - response, - getIdPrefix(parameters), - id, - ); - }, - () => { - chunk.annotation = null; }, - ); + ) + .then((response) => response.json()) + .then( + (response) => { + chunk.annotation = parseAnnotationResponse( + response, + getIdPrefix(parameters), + id, + ); + }, + () => { + chunk.annotation = null; + }, + ); } add(annotation: Annotation) { const { parameters } = this; const brainmapsAnnotation = annotationToBrainmaps(annotation); - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, - payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - responseType: "json", - }).then((response) => { - verifyObject(response); - const ids = verifyObjectProperty(response, "ids", verifyStringArray); - if (ids.length !== 1) { - throw new Error( - `Expected list of 1 id, but received ${JSON.stringify(ids)}.`, - ); - } - const idPrefix = getIdPrefix(this.parameters); - return parseBrainmapsAnnotationId(idPrefix, ids[0]); - }); + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, + { + method: "POST", + body: JSON.stringify({ annotations: [brainmapsAnnotation] }), + }, + ) + .then((response) => response.json()) + .then((response) => { + verifyObject(response); + const ids = verifyObjectProperty(response, "ids", verifyStringArray); + if (ids.length !== 1) { + throw new Error( + `Expected list of 1 id, but received ${JSON.stringify(ids)}.`, + ); + } + const idPrefix = getIdPrefix(this.parameters); + return parseBrainmapsAnnotationId(idPrefix, ids[0]); + }); } update(id: AnnotationId, annotation: Annotation) { const { parameters } = this; const brainmapsAnnotation = annotationToBrainmaps(annotation); brainmapsAnnotation.id = getFullSpatialAnnotationId(parameters, id); - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, - payload: JSON.stringify({ annotations: [brainmapsAnnotation] }), - responseType: "json", - }); + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:push`, + { + method: "POST", + body: JSON.stringify({ annotations: [brainmapsAnnotation] }), + }, + ).then((response) => response.json()); } delete(id: AnnotationId) { const { parameters } = this; - return makeRequest(parameters.instance, this.credentialsProvider, { - method: "POST", - path: `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:delete`, - payload: JSON.stringify({ - type: getSpatialAnnotationTypeFromId(id), - ids: [getFullSpatialAnnotationId(parameters, id)], - }), - responseType: "json", - }); + return makeRequest( + parameters.instance, + this.credentialsProvider, + `/v1/changes/${parameters.volumeId}/${parameters.changestack}/spatials:delete`, + { + method: "POST", + body: JSON.stringify({ + type: getSpatialAnnotationTypeFromId(id), + ids: [getFullSpatialAnnotationId(parameters, id)], + }), + }, + ).then((response) => response.json()); } } diff --git a/src/datasource/brainmaps/frontend.ts b/src/datasource/brainmaps/frontend.ts index b713dad7bd..aa5a16ba14 100644 --- a/src/datasource/brainmaps/frontend.ts +++ b/src/datasource/brainmaps/frontend.ts @@ -34,13 +34,16 @@ import { makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsProvider } from "#src/credentials_provider/index.js"; +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; import type { BrainmapsCredentialsProvider, BrainmapsInstance, OAuth2Credentials, } from "#src/datasource/brainmaps/api.js"; -import { makeRequest } from "#src/datasource/brainmaps/api.js"; +import { credentialsKey, makeRequest } from "#src/datasource/brainmaps/api.js"; import type { ChangeSpec, MultiscaleMeshInfo, @@ -58,9 +61,10 @@ import { import type { CompleteUrlOptions, DataSource, + DataSourceRegistry, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { VertexPositionFormat } from "#src/mesh/base.js"; import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import { SkeletonSource } from "#src/skeleton/frontend.js"; @@ -79,7 +83,6 @@ import { MultiscaleVolumeChunkSource as GenericMultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import { StatusMessage } from "#src/status.js"; import { transposeNestedArrays } from "#src/util/array.js"; import type { CompletionWithDescription } from "#src/util/completion.js"; import { @@ -106,7 +109,8 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { defaultStringCompare } from "#src/util/string.js"; class BrainmapsVolumeChunkSource extends WithParameters( @@ -691,8 +695,8 @@ const MultiscaleAnnotationSourceBase = WithParameters( ); export class BrainmapsAnnotationSource extends MultiscaleAnnotationSourceBase { - key: any; - parameters: AnnotationSourceParameters; + declare key: any; + declare parameters: AnnotationSourceParameters; credentialsProvider: Owned>; constructor( chunkManager: ChunkManager, @@ -769,49 +773,67 @@ const supportedQueryParameters = [ }, ]; -export class BrainmapsDataSource extends DataSourceProvider { +function getCredentialsProvider(credentialsManager: CredentialsManager) { + return credentialsManager.getCredentialsProvider( + credentialsKey, + ); +} + +export class BrainmapsDataSource implements DataSourceProvider { constructor( public instance: BrainmapsInstance, - public credentialsProvider: Owned, - ) { - super(); - } + public scheme: string, + ) {} get description() { return this.instance.description; } - private getMultiscaleInfo(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + private getMultiscaleInfo( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { type: "brainmaps:getMultiscaleInfo", volumeId, instance: this.instance, - credentialsProvider: getObjectId(this.credentialsProvider), }, - () => - makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/volumes/${volumeId}`, - responseType: "json", - }).then((response) => new MultiscaleVolumeInfo(response)), + options, + async (progressOptions) => { + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/volumes/${volumeId}`, + progressOptions, + ); + return new MultiscaleVolumeInfo(await response.json()); + }, ); } - private getMeshesInfo(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + private getMeshesInfo( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { type: "brainmaps:getMeshesInfo", volumeId, instance: this.instance, - credentialsProvider: getObjectId(this.credentialsProvider), }, - () => - makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/objects/${volumeId}/meshes`, - responseType: "json", - }).then((response) => parseMeshesResponse(response)), + options, + (progressOptions) => + makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/objects/${volumeId}/meshes`, + progressOptions, + ) + .then((response) => response.json()) + .then((response) => parseMeshesResponse(response)), ); } @@ -846,7 +868,7 @@ export class BrainmapsDataSource extends DataSourceProvider { chunkLayoutPreference, jpegQuality, }; - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "brainmaps:get", instance: this.instance, @@ -854,15 +876,19 @@ export class BrainmapsDataSource extends DataSourceProvider { changeSpec, brainmapsOptions, }, - async () => { + options, + async (progressOptions) => { + const credentialsProvider = getCredentialsProvider( + options.registry.credentialsManager, + ); const [multiscaleVolumeInfo, meshesInfo] = await Promise.all([ - this.getMultiscaleInfo(options.chunkManager, volumeId), - this.getMeshesInfo(options.chunkManager, volumeId), + this.getMultiscaleInfo(options.registry, volumeId, progressOptions), + this.getMeshesInfo(options.registry, volumeId, progressOptions), ]); const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, + options.registry.chunkManager, this.instance, - this.credentialsProvider, + credentialsProvider, volumeId, changeSpec, multiscaleVolumeInfo, @@ -916,10 +942,10 @@ export class BrainmapsDataSource extends DataSourceProvider { const { single } = mesh; if (single !== undefined) { if (single.type === "TRIANGLES") { - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsMeshSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, parameters: { instance: this.instance, volumeId: volumeId, @@ -929,10 +955,10 @@ export class BrainmapsDataSource extends DataSourceProvider { }, ); } else { - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsSkeletonSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, parameters: { instance: this.instance, volumeId: volumeId, @@ -944,10 +970,10 @@ export class BrainmapsDataSource extends DataSourceProvider { } } else { const multi = mesh.multi!; - meshSource = options.chunkManager.getChunkSource( + meshSource = options.registry.chunkManager.getChunkSource( BrainmapsMultiscaleMeshSource, { - credentialsProvider: this.credentialsProvider, + credentialsProvider, format: { fragmentRelativeVertices: false, vertexPositionFormat: VertexPositionFormat.float32, @@ -992,7 +1018,7 @@ export class BrainmapsDataSource extends DataSourceProvider { default: true, modelSubspaceDimensionIndices: [0, 1, 2], subsource: { - annotation: options.chunkManager.getChunkSource( + annotation: options.registry.chunkManager.getChunkSource( BrainmapsAnnotationSource, { parameters: { @@ -1002,7 +1028,7 @@ export class BrainmapsDataSource extends DataSourceProvider { upperVoxelBound: multiscaleVolumeInfo.scales[0].upperVoxelBound, }, - credentialsProvider: this.credentialsProvider, + credentialsProvider, }, ), }, @@ -1013,108 +1039,110 @@ export class BrainmapsDataSource extends DataSourceProvider { ); } - getProjectList(chunkManager: ChunkManager) { - return chunkManager.memoize.getUncounted( + getProjectList( + registry: DataSourceRegistry, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: "brainmaps:getProjectList" }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: "/v1beta2/projects", - responseType: "json", - }).then((projectsResponse) => { - return parseProjectList(projectsResponse); + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} project list`, }); - const description = `${this.instance.description} project list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}.`, - errorPrefix: `Error retrieving ${description}: `, - }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + "/v1beta2/projects", + progressOptions, + ); + return parseProjectList(await response.json()); }, ); } - getDatasetList(chunkManager: ChunkManager, project: string) { - return chunkManager.memoize.getUncounted( + getDatasetList( + registry: DataSourceRegistry, + project: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: `brainmaps:${project}:getDatasetList` }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/datasets?project_id=${project}`, - responseType: "json", - }).then((datasetsResponse) => { - return parseAPIResponseList(datasetsResponse, "datasetIds"); - }); - const description = `${this.instance.description} dataset list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}`, - errorPrefix: `Error retrieving ${description}`, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} dataset list for ${project}`, }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/datasets?project_id=${project}`, + ); + return parseAPIResponseList(await response.json(), "datasetIds"); }, ); } - getVolumeList(chunkManager: ChunkManager, project: string, dataset: string) { - return chunkManager.memoize.getUncounted( + getVolumeList( + registry: DataSourceRegistry, + project: string, + dataset: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: `brainmaps:${project}:${dataset}:getVolumeList`, }, - () => { - const promise = makeRequest(this.instance, this.credentialsProvider, { - method: "GET", - path: `/v1beta2/volumes?project_id=${project}&dataset_id=${dataset}`, - responseType: "json", - }).then((volumesResponse) => { - const fullyQualifyiedVolumeList = parseAPIResponseList( - volumesResponse, - "volumeId", - ); - const splitPoint = project.length + dataset.length + 2; - const volumeList = []; - for (const volume of fullyQualifyiedVolumeList) { - volumeList.push(volume.substring(splitPoint)); - } - return volumeList; + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} volume list for ${project}:${dataset}`, }); - const description = `${this.instance.description} volume list`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}`, - errorPrefix: `Error retrieving ${description}`, - }); - return promise; + + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/volumes?project_id=${project}&dataset_id=${dataset}`, + progressOptions, + ); + const fullyQualifyiedVolumeList = parseAPIResponseList( + await response.json(), + "volumeId", + ); + const splitPoint = project.length + dataset.length + 2; + const volumeList = []; + for (const volume of fullyQualifyiedVolumeList) { + volumeList.push(volume.substring(splitPoint)); + } + return volumeList; }, ); } - getChangeStackList(chunkManager: ChunkManager, volumeId: string) { - return chunkManager.memoize.getUncounted( + getChangeStackList( + registry: DataSourceRegistry, + volumeId: string, + options: Partial, + ) { + return registry.chunkManager.memoize.getAsync( { instance: this.instance, type: "brainmaps:getChangeStackList", volumeId, }, - () => { - const promise: Promise = makeRequest( - this.instance, - this.credentialsProvider, - { - method: "GET", - path: `/v1beta2/changes/${volumeId}/change_stacks`, - responseType: "json", - }, - ).then((response) => parseChangeStackList(response)); - const description = `change stacks for ${volumeId}`; - StatusMessage.forPromise(promise, { - delay: true, - initialMessage: `Retrieving ${description}.`, - errorPrefix: `Error retrieving ${description}: `, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving ${this.instance.description} change stack list for ${volumeId}`, }); - return promise; + const response = await makeRequest( + this.instance, + getCredentialsProvider(registry.credentialsManager), + `/v1beta2/changes/${volumeId}/change_stacks`, + progressOptions, + ); + return parseChangeStackList(await response.json()); }, ); } @@ -1137,7 +1165,11 @@ export class BrainmapsDataSource extends DataSourceProvider { } if (meshName !== undefined) { const volumeId = `${project}:${dataset}:${volume}`; - const meshes = await this.getMeshesInfo(options.chunkManager, volumeId); + const meshes = await this.getMeshesInfo( + options.registry, + volumeId, + options, + ); const results: CompletionWithDescription[] = []; const seenMultiscale = new Set(); for (const mesh of meshes) { @@ -1174,8 +1206,9 @@ export class BrainmapsDataSource extends DataSourceProvider { if (changestack !== undefined) { const volumeId = `${project}:${dataset}:${volume}`; const changeStacks = await this.getChangeStackList( - options.chunkManager, + options.registry, volumeId, + options, ); if (changeStacks === undefined) { throw null; @@ -1190,12 +1223,16 @@ export class BrainmapsDataSource extends DataSourceProvider { offset: providerUrl.length - volume.length, completions: getPrefixMatches( volume, - await this.getVolumeList(options.chunkManager, project, dataset), + await this.getVolumeList(options.registry, project, dataset, options), ), }; } if (dataset !== undefined) { - const datasets = await this.getDatasetList(options.chunkManager, project); + const datasets = await this.getDatasetList( + options.registry, + project, + options, + ); return { offset: providerUrl.length - dataset.length, completions: getPrefixMatches( @@ -1205,7 +1242,7 @@ export class BrainmapsDataSource extends DataSourceProvider { }; } - const projects = await this.getProjectList(options.chunkManager); + const projects = await this.getProjectList(options.registry, options); return { offset: 0, completions: getPrefixMatchesWithDescriptions( diff --git a/src/datasource/brainmaps/register_credentials_provider.ts b/src/datasource/brainmaps/register_credentials_provider.ts index 4d3035b159..f31189e993 100644 --- a/src/datasource/brainmaps/register_credentials_provider.ts +++ b/src/datasource/brainmaps/register_credentials_provider.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/brainmaps/api.js"; import { BrainmapsCredentialsProvider } from "#src/datasource/brainmaps/credentials_provider.js"; @@ -22,7 +22,7 @@ import { BrainmapsCredentialsProvider } from "#src/datasource/brainmaps/credenti declare const NEUROGLANCER_BRAINMAPS_CLIENT_ID: string | undefined; if (typeof NEUROGLANCER_BRAINMAPS_CLIENT_ID !== "undefined") { - defaultCredentialsManager.register( + registerDefaultCredentialsProvider( credentialsKey, () => new BrainmapsCredentialsProvider(NEUROGLANCER_BRAINMAPS_CLIENT_ID!), ); diff --git a/src/datasource/brainmaps/register_default.ts b/src/datasource/brainmaps/register_default.ts index 03c94c992f..c06935310e 100644 --- a/src/datasource/brainmaps/register_default.ts +++ b/src/datasource/brainmaps/register_default.ts @@ -15,21 +15,13 @@ */ import type { BrainmapsInstance } from "#src/datasource/brainmaps/api.js"; -import { credentialsKey } from "#src/datasource/brainmaps/api.js"; import { BrainmapsDataSource, productionInstance, } from "#src/datasource/brainmaps/frontend.js"; import { registerProvider } from "#src/datasource/default_provider.js"; -registerProvider( - "brainmaps", - (options) => - new BrainmapsDataSource( - productionInstance, - options.credentialsManager.getCredentialsProvider(credentialsKey), - ), -); +registerProvider(new BrainmapsDataSource(productionInstance, "brainmaps")); declare const NEUROGLANCER_BRAINMAPS_SERVERS: | { [key: string]: BrainmapsInstance } @@ -39,13 +31,6 @@ if (typeof NEUROGLANCER_BRAINMAPS_SERVERS !== "undefined") { for (const [key, instance] of Object.entries( NEUROGLANCER_BRAINMAPS_SERVERS, )) { - registerProvider( - `brainmaps-${key}`, - (options) => - new BrainmapsDataSource( - instance, - options.credentialsManager.getCredentialsProvider(credentialsKey), - ), - ); + registerProvider(new BrainmapsDataSource(instance, `brainmaps-${key}`)); } } diff --git a/src/datasource/deepzoom/backend.ts b/src/datasource/deepzoom/backend.ts index 0c7ac55a44..fc5a74d8d6 100644 --- a/src/datasource/deepzoom/backend.ts +++ b/src/datasource/deepzoom/backend.ts @@ -18,21 +18,14 @@ import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; import { decodePng } from "#src/async_computation/decode_png_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { ImageTileEncoding, ImageTileSourceParameters, } from "#src/datasource/deepzoom/base.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { transposeArray2d } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - isNotFoundError, - responseArrayBuffer, -} from "#src/util/http_request.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; /* This is enough if support for these aren't needed: @@ -43,11 +36,13 @@ import { registerSharedObject } from "#src/worker_rpc.js"; @registerSharedObject() export class DeepzoomImageTileSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), ImageTileSourceParameters, ) { + private tileKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + gridShape = (() => { const gridShape = new Uint32Array(2); const { upperVoxelBound, chunkDataSize } = this.spec; @@ -57,10 +52,7 @@ export class DeepzoomImageTileSource extends WithParameters( return gridShape; })(); - async download( - chunk: VolumeChunk, - cancellationToken: CancellationToken, - ): Promise { + async download(chunk: VolumeChunk, signal: AbortSignal): Promise { const { parameters } = this; // /* This block is enough if support for these aren't needed: @@ -70,7 +62,7 @@ export class DeepzoomImageTileSource extends WithParameters( // const {tilesize, overlap} = parameters; // const [x, y] = chunk.chunkGridPosition; // const url = `${parameters.url}/${x}_${y}.${ImageTileEncoding[parameters.encoding].toLowerCase()}`; - // const response: Blob = await cancellableFetchSpecialOk(this.credentialsProvider, url, {}, response => response.blob(), cancellationToken); + // const response: Blob = await (await fetchSpecialOk(this.credentialsProvider, url, {signal: signal})).blob(); // const tile = await createImageBitmap(response); // const canvas = new OffscreenCanvas(tilesize, tilesize); // const ctx = canvas.getContext("2d")!; @@ -89,75 +81,71 @@ export class DeepzoomImageTileSource extends WithParameters( const [x, y] = chunk.chunkGridPosition; const ox = x === 0 ? 0 : overlap; const oy = y === 0 ? 0 : overlap; - const url = `${parameters.url}/${x}_${y}.${parameters.format}`; - try { - const responseBuffer = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); - - let tilewidth = 0; - let tileheight = 0; - let tiledata: Uint8Array | undefined; - switch (encoding) { - case ImageTileEncoding.PNG: { - const pngbitmap = await requestAsyncComputation( - decodePng, - cancellationToken, - [responseBuffer], - new Uint8Array(responseBuffer), - undefined, - undefined, - undefined, - 3, - 1, - false, - ); - ({ width: tilewidth, height: tileheight } = pngbitmap); - tiledata = transposeArray2d( - pngbitmap.uint8Array, - tilewidth * tileheight, - 3, - ); - break; - } + const path = `${this.tileKvStore.path}/${x}_${y}.${parameters.format}`; + const response = await this.tileKvStore.store.read(path, { + signal, + }); + if (response === undefined) { + return; + } + const responseArray = new Uint8Array(await response.response.arrayBuffer()); - case ImageTileEncoding.JPG: - case ImageTileEncoding.JPEG: { - const jpegbitmap = await requestAsyncComputation( - decodeJpeg, - cancellationToken, - [responseBuffer], - new Uint8Array(responseBuffer), - undefined, - undefined, - undefined, - 3, - false, - ); - ({ - uint8Array: tiledata, - width: tilewidth, - height: tileheight, - } = jpegbitmap); - break; - } + let tilewidth = 0; + let tileheight = 0; + let tiledata: Uint8Array | undefined; + switch (encoding) { + case ImageTileEncoding.PNG: { + const pngbitmap = await requestAsyncComputation( + decodePng, + signal, + [responseArray.buffer], + responseArray, + undefined, + undefined, + undefined, + 3, + 1, + false, + ); + ({ width: tilewidth, height: tileheight } = pngbitmap); + tiledata = transposeArray2d( + pngbitmap.uint8Array, + tilewidth * tileheight, + 3, + ); + break; } - if (tiledata !== undefined) { - const t2 = tilesize * tilesize; - const twh = tilewidth * tileheight; - const d = (chunk.data = new Uint8Array(t2 * 3)); - for (let k = 0; k < 3; k++) - for (let j = 0; j < tileheight; j++) - for (let i = 0; i < tilewidth; i++) - d[i + j * tilesize + k * t2] = - tiledata[i + ox + (j + oy) * tilewidth + k * twh]; + + case ImageTileEncoding.JPG: + case ImageTileEncoding.JPEG: { + const jpegbitmap = await requestAsyncComputation( + decodeJpeg, + signal, + [responseArray.buffer], + responseArray, + undefined, + undefined, + undefined, + 3, + false, + ); + ({ + uint8Array: tiledata, + width: tilewidth, + height: tileheight, + } = jpegbitmap); + break; } - } catch (e) { - if (!isNotFoundError(e)) throw e; + } + if (tiledata !== undefined) { + const t2 = tilesize * tilesize; + const twh = tilewidth * tileheight; + const d = (chunk.data = new Uint8Array(t2 * 3)); + for (let k = 0; k < 3; k++) + for (let j = 0; j < tileheight; j++) + for (let i = 0; i < tilewidth; i++) + d[i + j * tilesize + k * t2] = + tiledata[i + ox + (j + oy) * tilewidth + k * twh]; } } } diff --git a/src/datasource/deepzoom/frontend.ts b/src/datasource/deepzoom/frontend.ts index d91f269dec..826d43e438 100644 --- a/src/datasource/deepzoom/frontend.ts +++ b/src/datasource/deepzoom/frontend.ts @@ -15,7 +15,6 @@ */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { BoundingBox, @@ -26,26 +25,24 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import { ImageTileEncoding, ImageTileSourceParameters, } from "#src/datasource/deepzoom/base.js"; -import { responseText } from "#src/datasource/dvid/api.js"; import type { - CompleteUrlOptions, - ConvertLegacyUrlOptions, DataSource, DataSubsourceEntry, - GetDataSourceOptions, - NormalizeUrlOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; -import { - parseProviderUrl, - resolvePath, - unparseProviderUrl, -} from "#src/datasource/precomputed/frontend.js"; +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -58,7 +55,6 @@ import { } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { DataType } from "#src/util/data_type.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; import { verifyEnumString, verifyInt, @@ -66,18 +62,11 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; /*export*/ class DeepzoomImageTileSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), ImageTileSourceParameters, ) {} @@ -151,12 +140,11 @@ interface LevelInfo { url: string; constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, - /*public*/ url: string, + public sharedKvStoreContext: SharedKvStoreContext, + url: string, public info: PyramidalImageInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); this.url = url.substring(0, url.lastIndexOf(".")) + "_files"; } @@ -197,13 +185,10 @@ interface LevelInfo { chunkSource: this.chunkManager.getChunkSource( DeepzoomImageTileSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: resolvePath( - this.url, - (array.length - 1 - index).toString(), - ), + url: `${this.url}/${array.length - 1 - index}/`, encoding: this.info.encoding, format: this.info.format, overlap: this.info.overlap, @@ -229,9 +214,9 @@ interface DZIMetaData { } function getDZIMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { if (url.endsWith(".json") || url.includes(".json?")) { /* http://openseadragon.github.io/examples/tilesource-dzi/ @@ -241,19 +226,21 @@ function getDZIMetadata( */ throw new Error("DZI-JSON: OpenSeadragon hack not supported yet."); } - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "deepzoom:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - const text = await cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseText, - ); + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading Deep Zoom metadata from ${url}`, + }); + const { response } = await sharedKvStoreContext.kvStoreContext.read(url, { + ...progressOptions, + throwIfMissing: true, + }); + const text = await response.text(); const xml = new DOMParser().parseFromString(text, "text/xml"); const image = xml.documentElement; const size = verifyObject(image.getElementsByTagName("Size").item(0)); @@ -270,16 +257,14 @@ function getDZIMetadata( ); } -async function getImageDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, +function getImageDataSource( + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: DZIMetaData, -): Promise { +): DataSource { const info = buildPyramidalImageInfo(metadata); const volume = new DeepzoomPyramidalImageTileSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, url, info, ); @@ -300,53 +285,61 @@ async function getImageDataSource( }, }, ]; - return { modelTransform: makeIdentityTransform(modelSpace), subsources }; + return { + modelTransform: makeIdentityTransform(modelSpace), + subsources, + canonicalUrl: `${url}|deepzoom:`, + }; } -export class DeepzoomDataSource extends DataSourceProvider { - get description() { - return "Deep Zoom file-backed data source"; - } - - normalizeUrl(options: NormalizeUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); +export class DeepzoomDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "deepzoom"; } - - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get description() { + return "Deep Zoom data source"; } - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, - ); - return options.chunkManager.memoize.getUncounted( - { type: "deepzoom:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); + return options.registry.chunkManager.memoize.getAsync( + { type: "deepzoom:get", url: options.kvStoreUrl }, + options, + async (progressOptions): Promise => { const metadata = await getDZIMetadata( - options.chunkManager, - credentialsProvider, - url, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + progressOptions, + ); + return getImageDataSource( + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + metadata, ); - return getImageDataSource(options, credentialsProvider, url, metadata); }, ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, - ); +} + +async function detectFormat( + options: AutoDetectFileOptions, +): Promise { + const text = new TextDecoder().decode(options.prefix); + const xml = new DOMParser().parseFromString(text, "text/xml"); + if ( + xml.documentElement.tagName === "Image" && + xml.documentElement.namespaceURI === + "http://schemas.microsoft.com/deepzoom/2009" + ) { + return [{ suffix: "deepzoom:", description: "Deep Zoom" }]; } + return []; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 500, + suffixLength: 0, + match: detectFormat, + }); } diff --git a/src/datasource/deepzoom/index.rst b/src/datasource/deepzoom/index.rst new file mode 100644 index 0000000000..ef3d61c92e --- /dev/null +++ b/src/datasource/deepzoom/index.rst @@ -0,0 +1,27 @@ +.. _deepzoom-datasource: + +Deep Zoom +========= + +The Deep Zoom :ref:`data format driver` supports the Deep Zoom XML +format. + +URL syntax +---------- + +- :file:`{KVSTORE-URL.dzi}|deepzoom:` + +Examples +-------- + +- `https://data-proxy.ebrains.eu/api/v1/buckets/localizoom/14122_mPPC_BDA_s186.tif/14122_mPPC_BDA_s186.dzi|deepzoom: `__ + + `Olsen, G. M., Hovde, K., Sakshaug, T., Sømme H., H., Monterotti, B., Laja, A., Reiten, I., Leergaard, T. B., & Witter, M. P. (2020). Anterogradely labeled axonal projections from the posterior parietal cortex in rat [Data set]. EBRAINS. `__ + + Coronal section of rat brain at 325 nanometer resolution. + +Auto detection +-------------- + +Deep Zoom files are detected automatically based on the signature at the start +of the file. diff --git a/src/datasource/deepzoom/register_default.ts b/src/datasource/deepzoom/register_default.ts index eb9c8a387d..cf97508b87 100644 --- a/src/datasource/deepzoom/register_default.ts +++ b/src/datasource/deepzoom/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { DeepzoomDataSource } from "#src/datasource/deepzoom/frontend.js"; -import { registerProvider } from "#src/datasource/default_provider.js"; +import { + DeepzoomDataSource, + registerAutoDetect, +} from "#src/datasource/deepzoom/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -registerProvider("deepzoom", () => new DeepzoomDataSource()); +const provider = new DeepzoomDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/default_provider.ts b/src/datasource/default_provider.ts index bc72938543..85bf8b0aa7 100644 --- a/src/datasource/default_provider.ts +++ b/src/datasource/default_provider.ts @@ -18,32 +18,47 @@ * @file Facility for registering default data sources. */ -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { DataSourceProvider } from "#src/datasource/index.js"; -import { DataSourceProviderRegistry } from "#src/datasource/index.js"; -import type { Owned } from "#src/util/disposable.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import type { + DataSourceProvider, + KvStoreBasedDataSourceProvider, +} from "#src/datasource/index.js"; +import { DataSourceRegistry } from "#src/datasource/index.js"; +import { LocalDataSourceProvider } from "#src/datasource/local.js"; +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; export interface ProviderOptions { - credentialsManager: CredentialsManager; + credentialsManager: SharedCredentialsManager; + kvStoreContext: SharedKvStoreContext; } -export type ProviderFactory = ( - options: ProviderOptions, -) => Owned; -const providerFactories = new Map(); +const providers: DataSourceProvider[] = []; +const kvStoreBasedProviders: KvStoreBasedDataSourceProvider[] = []; +export const dataSourceAutoDetectRegistry = new AutoDetectRegistry(); -export function registerProvider(name: string, factory: ProviderFactory) { - providerFactories.set(name, factory); +export function registerProvider(provider: DataSourceProvider) { + providers.push(provider); +} + +export function registerKvStoreBasedDataProvider( + provider: KvStoreBasedDataSourceProvider, +) { + kvStoreBasedProviders.push(provider); } export function getDefaultDataSourceProvider(options: ProviderOptions) { - const provider = new DataSourceProviderRegistry(options.credentialsManager); - for (const [name, factory] of providerFactories) { - try { - provider.register(name, factory(options)); - } catch (e) { - console.warn(`Skipping ${name} data source: ${e}`); - } + const registry = new DataSourceRegistry(options.kvStoreContext); + registry.register(new LocalDataSourceProvider()); + for (const provider of providers) { + registry.register(provider); + } + for (const provider of kvStoreBasedProviders) { + registry.registerKvStoreBasedProvider(provider); } - return provider; + options.kvStoreContext.kvStoreContext.autoDetectRegistry.copyTo( + registry.autoDetectRegistry, + ); + dataSourceAutoDetectRegistry.copyTo(registry.autoDetectRegistry); + return registry; } diff --git a/src/datasource/dvid/api.ts b/src/datasource/dvid/api.ts index 731c2c2846..c9f0ed1ed2 100644 --- a/src/datasource/dvid/api.ts +++ b/src/datasource/dvid/api.ts @@ -18,16 +18,8 @@ * limitations under the License. */ -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import type { CredentialsProvider } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { - cancellableFetchOk, - responseArrayBuffer, - responseJson, -} from "#src/util/http_request.js"; export interface DVIDToken { // If token is undefined, it indicates anonymous credentials that may be retried. @@ -36,12 +28,6 @@ export interface DVIDToken { export const credentialsKey = "DVID"; -interface HttpCall { - method: "GET" | "POST" | "DELETE" | "HEAD"; - url: string; - payload?: string; -} - export class DVIDInstance { constructor( public baseUrl: string, @@ -85,91 +71,15 @@ export function appendQueryStringForDvid( return url; } -export function responseText(response: Response): Promise { - return response.text(); -} - -export function makeRequest( - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: "" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequest( - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): any { - const requestInfo = `${httpCall.url}`; - const init = { method: httpCall.method, body: httpCall.payload }; - - if (httpCall.responseType === "") { - return cancellableFetchOk( - requestInfo, - init, - responseText, - cancellationToken, - ); - } - return cancellableFetchOk(requestInfo, init, responseJson, cancellationToken); -} - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "arraybuffer" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "json" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: "" }, - cancellationToken?: CancellationToken, -): Promise; - -export function makeRequestWithCredentials( - credentialsProvider: CredentialsProvider, - httpCall: HttpCall & { responseType: XMLHttpRequestResponseType }, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - return fetchWithDVIDCredentials( - credentialsProvider, - httpCall.url, - { method: httpCall.method, body: httpCall.payload }, - httpCall.responseType === "" - ? responseText - : httpCall.responseType === "json" - ? responseJson - : responseArrayBuffer, - cancellationToken, - ); -} - -export function fetchWithDVIDCredentials( +export function fetchWithDVIDCredentials( credentialsProvider: CredentialsProvider, input: string, init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - return fetchWithCredentials( +): Promise { + return fetchOkWithCredentials( credentialsProvider, input, init, - transformResponse, (credentials: DVIDToken, init: RequestInit) => { const newInit: RequestInit = { ...init }; if (credentials.token) { @@ -188,6 +98,5 @@ export function fetchWithDVIDCredentials( } throw error; }, - cancellationToken, ); } diff --git a/src/datasource/dvid/backend.ts b/src/datasource/dvid/backend.ts index 94d8ca0311..c136a10dad 100644 --- a/src/datasource/dvid/backend.ts +++ b/src/datasource/dvid/backend.ts @@ -20,7 +20,7 @@ import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provi import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { DVIDInstance, - makeRequestWithCredentials, + fetchWithDVIDCredentials, appendQueryStringForDvid, } from "#src/datasource/dvid/api.js"; import { @@ -42,7 +42,6 @@ import { decodeCompressedSegmentationChunk } from "#src/sliceview/backend_chunk_ import { decodeJpegChunk } from "#src/sliceview/backend_chunk_decoders/jpeg.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import type { SharedObject } from "#src/worker_rpc.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @@ -65,7 +64,7 @@ export class DVIDSkeletonSource extends DVIDSource( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const bodyid = `${chunk.objectId}`; const url = @@ -73,18 +72,18 @@ export class DVIDSkeletonSource extends DVIDSource( `/${parameters.dataInstanceKey}/key/` + bodyid + "_swc"; - return makeRequestWithCredentials( + return fetchWithDVIDCredentials( this.credentialsProvider, + appendQueryStringForDvid(url, parameters.user), { - method: "GET", - url: appendQueryStringForDvid(url, parameters.user), - responseType: "arraybuffer", + signal: signal, }, - cancellationToken, - ).then((response) => { - const enc = new TextDecoder("utf-8"); - decodeSwcSkeletonChunk(chunk, enc.decode(response)); - }); + ) + .then((response) => response.arrayBuffer()) + .then((response) => { + const enc = new TextDecoder("utf-8"); + decodeSwcSkeletonChunk(chunk, enc.decode(response)); + }); } } @@ -118,7 +117,7 @@ export class DVIDMeshSource extends DVIDSource( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const dvidInstance = new DVIDInstance( parameters.baseUrl, @@ -129,15 +128,15 @@ export class DVIDMeshSource extends DVIDSource( `${chunk.fragmentId}.ngmesh`, ); - return makeRequestWithCredentials( + return fetchWithDVIDCredentials( this.credentialsProvider, + appendQueryStringForDvid(meshUrl, parameters.user), { - method: "GET", - url: appendQueryStringForDvid(meshUrl, parameters.user), - responseType: "arraybuffer", + signal: signal, }, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + ) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } @@ -146,7 +145,7 @@ export class DVIDVolumeChunkSource extends DVIDSource( VolumeChunkSource, VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const params = this.parameters; let path: string; { @@ -159,18 +158,14 @@ export class DVIDVolumeChunkSource extends DVIDSource( path = this.getPath(chunkPosition, chunkDataSize); } const decoder = this.getDecoder(params); - const response = await makeRequestWithCredentials( + const response = await fetchWithDVIDCredentials( this.credentialsProvider, - { - method: "GET", - url: appendQueryStringForDvid(`${params.baseUrl}${path}`, params.user), - responseType: "arraybuffer", - }, - cancellationToken, - ); + appendQueryStringForDvid(`${params.baseUrl}${path}`, params.user), + { signal: signal }, + ).then((response) => response.arrayBuffer()); await decoder( chunk, - cancellationToken, + signal, params.encoding === VolumeChunkEncoding.JPEG ? response.slice(16) : response, diff --git a/src/datasource/dvid/credentials_provider.ts b/src/datasource/dvid/credentials_provider.ts index 24362dfa2b..74dd40f515 100644 --- a/src/datasource/dvid/credentials_provider.ts +++ b/src/datasource/dvid/credentials_provider.ts @@ -23,26 +23,21 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; +import { getCredentialsWithStatus } from "#src/credentials_provider/interactive_credentials_provider.js"; import type { DVIDToken } from "#src/datasource/dvid/api.js"; -import { responseText } from "#src/datasource/dvid/api.js"; -import { StatusMessage } from "#src/status.js"; -import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; async function getAuthToken( authServer: string, - cancellationToken = uncancelableToken, + signal: AbortSignal, ): Promise { - const token = await cancellableFetchOk( - authServer, - { method: "GET", credentials: "include" }, - responseText, - cancellationToken, - ); + const response = await fetchOk(authServer, { + method: "GET", + credentials: "include", + signal: signal, + }); + const token = await response.text(); return { token }; } @@ -51,80 +46,36 @@ class BaseDVIDCredentialsProvider extends CredentialsProvider { super(); } - get = makeCredentialsGetter((cancellationToken) => { - if (!this.authServer) return Promise.resolve({ token: "" }); - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeAuthStatus( - authServer: string, - msg = "DVID authorization required.", - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { + get = makeCredentialsGetter(async (options) => { + const { authServer } = this; + if (!authServer) return { token: "" }; + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting DVID access token from ${authServer}`, + }); + return await getCredentialsWithStatus( + { + description: `DVID server ${this.authServer}`, + supportsImmediate: true, + get: async (signal, immediate) => { + if (immediate) { + return await getAuthToken(authServer, signal); + } // In the current DVID setup, https://flyemlogin. is expected for the login server const match = authServer.match(/^[^/]+\/\/[^/.]+\.([^/]+)/); if (match) { const loginServer = `https://flyemlogin.${match[1]}/login`; - window.alert( + throw new Error( `Please log into ${loginServer} and then refresh the neurogalncer page to try again.\nIf you are unable to log into ${loginServer}, please check your authorization server ${authServer} to make sure it is correct.`, ); } else { - window.alert( + throw new Error( `Please check your authorization server ${authServer} to make sure it is correct.`, ); } - }); - status.setVisible(true); - } - - function requestAuth(authServer: string) { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeAuthStatus( - authServer, - "Waiting for DVID authorization...", - "Retry", - ); - getAuthToken(authServer, cancellationSource).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - writeAuthStatus( - authServer, - `DVID authorization failed: ${reason}.`, - "Retry", - ); - } - }, - ); - } - requestAuth(this.authServer!); - }); + }, + }, + options.signal, + ); }); } diff --git a/src/datasource/dvid/frontend.ts b/src/datasource/dvid/frontend.ts index 9121f80821..d4db7ffa4e 100644 --- a/src/datasource/dvid/frontend.ts +++ b/src/datasource/dvid/frontend.ts @@ -29,14 +29,11 @@ import { makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { - CredentialsManager, - CredentialsProvider, -} from "#src/credentials_provider/index.js"; +import type { CredentialsProvider } from "#src/credentials_provider/index.js"; import type { DVIDToken } from "#src/datasource/dvid/api.js"; import { credentialsKey, - makeRequestWithCredentials, + fetchWithDVIDCredentials, } from "#src/datasource/dvid/api.js"; import type { DVIDSourceParameters } from "#src/datasource/dvid/base.js"; import { @@ -50,8 +47,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { MeshSource } from "#src/mesh/frontend.js"; import { SkeletonSource } from "#src/skeleton/frontend.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; @@ -65,7 +62,6 @@ import { MultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import { StatusMessage } from "#src/status.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { applyCompletionOffset, @@ -85,6 +81,8 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; const serverDataTypes = new Map(); serverDataTypes.set("uint8", DataType.UINT8); @@ -453,22 +451,21 @@ export function getServerInfo( chunkManager: ChunkManager, baseUrl: string, credentialsProvider: CredentialsProvider, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "dvid:getServerInfo", baseUrl }, - () => { - const result = makeRequestWithCredentials(credentialsProvider, { - url: `${baseUrl}/api/repos/info`, - method: "GET", - responseType: "json", - }).then((response) => new ServerInfo(response)); - const description = `repository info for DVID server ${baseUrl}`; - StatusMessage.forPromise(result, { - initialMessage: `Retrieving ${description}.`, - delay: true, - errorPrefix: `Error retrieving ${description}: `, + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Retrieving repository info for DVID server ${baseUrl}`, }); - return result; + const response = await fetchWithDVIDCredentials( + credentialsProvider, + `${baseUrl}/api/repos/info`, + progressOptions, + ); + return new ServerInfo(await response.json()); }, ); } @@ -568,7 +565,7 @@ function getVolumeSource( }); const volume = new DvidMultiscaleVolumeChunkSource( - options.chunkManager, + options.registry.chunkManager, baseUrl, nodeKey, dataInstanceKey, @@ -595,7 +592,7 @@ function getVolumeSource( id: "meshes", default: true, subsource: { - mesh: options.chunkManager.getChunkSource(DVIDMeshSource, { + mesh: options.registry.chunkManager.getChunkSource(DVIDMeshSource, { parameters: { ...sourceParameters, dataInstanceKey: info.meshSrc, @@ -611,7 +608,7 @@ function getVolumeSource( id: "skeletons", default: true, subsource: { - mesh: options.chunkManager.getChunkSource(DVIDSkeletonSource, { + mesh: options.registry.chunkManager.getChunkSource(DVIDSkeletonSource, { parameters: { ...sourceParameters, dataInstanceKey: info.skeletonSrc, @@ -638,16 +635,17 @@ export function getDataSource( const sourceParameters = parseSourceUrl(options.providerUrl); const { baseUrl, nodeKey, dataInstanceKey } = sourceParameters; - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "dvid:MultiscaleVolumeChunkSource", baseUrl, nodeKey: nodeKey, dataInstanceKey, }, - async () => { + options, + async (progressOptions) => { const credentailsProvider = - options.credentialsManager.getCredentialsProvider( + options.registry.credentialsManager.getCredentialsProvider( credentialsKey, { dvidServer: sourceParameters.baseUrl, @@ -655,9 +653,10 @@ export function getDataSource( }, ); const serverInfo = await getServerInfo( - options.chunkManager, + options.registry.chunkManager, baseUrl, credentailsProvider, + progressOptions, ); const repositoryInfo = serverInfo.getNode(nodeKey); if (repositoryInfo === undefined) { @@ -740,12 +739,13 @@ export async function completeUrl( const authServer = getDefaultAuthServer(baseUrl); const serverInfo = await getServerInfo( - options.chunkManager, + options.registry.chunkManager, baseUrl, - options.credentialsManager.getCredentialsProvider( + options.registry.credentialsManager.getCredentialsProvider( credentialsKey, { dvidServer: baseUrl, authServer }, ), + options, ); return applyCompletionOffset( baseUrl.length + 1, @@ -753,11 +753,10 @@ export async function completeUrl( ); } -export class DVIDDataSource extends DataSourceProvider { - constructor(public credentialsManager: CredentialsManager) { - super(); +export class DVIDDataSource implements DataSourceProvider { + get scheme() { + return "dvid"; } - get description() { return "DVID"; } diff --git a/src/datasource/dvid/index.rst b/src/datasource/dvid/index.rst new file mode 100644 index 0000000000..2d8e4a23b8 --- /dev/null +++ b/src/datasource/dvid/index.rst @@ -0,0 +1,14 @@ +.. _dvid-datasource: + +DVID +==== + +The DVID :ref:`data service driver` enables Neuroglancer to view +`Distributed Versioned Image-oriented Dataservice (DVID) `__ +datasets. + +URL syntax +---------- + +- :file:`dvid://https://{host}/{node}/{data-instance}` +- :file:`dvid://http://{host}/{node}/{data-instance}` diff --git a/src/datasource/dvid/register_credentials_provider.ts b/src/datasource/dvid/register_credentials_provider.ts index d14e3bb2e9..42891dc49a 100644 --- a/src/datasource/dvid/register_credentials_provider.ts +++ b/src/datasource/dvid/register_credentials_provider.ts @@ -18,11 +18,11 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import { credentialsKey } from "#src/datasource/dvid/api.js"; import { DVIDCredentialsProvider } from "#src/datasource/dvid/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( credentialsKey, (params: { dvidServer: string; authServer: string | undefined }) => new DVIDCredentialsProvider(params.dvidServer, params.authServer), diff --git a/src/datasource/dvid/register_default.ts b/src/datasource/dvid/register_default.ts index ac96fb56f7..810a8dbb79 100644 --- a/src/datasource/dvid/register_default.ts +++ b/src/datasource/dvid/register_default.ts @@ -17,7 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { DVIDDataSource } from "#src/datasource/dvid/frontend.js"; -registerProvider( - "dvid", - (options) => new DVIDDataSource(options.credentialsManager), -); +registerProvider(new DVIDDataSource()); diff --git a/src/datasource/enabled_backend_modules.ts b/src/datasource/enabled_backend_modules.ts index 926dea0f29..62f3d8564e 100644 --- a/src/datasource/enabled_backend_modules.ts +++ b/src/datasource/enabled_backend_modules.ts @@ -5,7 +5,6 @@ import "#datasource/deepzoom/backend"; import "#datasource/dvid/backend"; import "#datasource/graphene/backend"; import "#datasource/n5/backend"; -import "#datasource/nggraph/backend"; import "#datasource/nifti/backend"; import "#datasource/obj/backend"; import "#datasource/precomputed/backend"; diff --git a/src/datasource/enabled_frontend_modules.ts b/src/datasource/enabled_frontend_modules.ts index 96b934b7b7..264c63800b 100644 --- a/src/datasource/enabled_frontend_modules.ts +++ b/src/datasource/enabled_frontend_modules.ts @@ -7,13 +7,12 @@ import "#datasource/deepzoom/register_default"; import "#datasource/dvid/register_default"; import "#datasource/dvid/register_credentials_provider"; import "#datasource/graphene/register_default"; -import "#datasource/middleauth/register_credentials_provider"; import "#datasource/n5/register_default"; -import "#datasource/ngauth/register_credentials_provider"; import "#datasource/nggraph/register_default"; import "#datasource/nifti/register_default"; import "#datasource/obj/register_default"; import "#datasource/precomputed/register_default"; +import "#datasource/python/register_default"; import "#datasource/render/register_default"; import "#datasource/vtk/register_default"; import "#datasource/zarr/register_default"; diff --git a/src/datasource/graphene/backend.ts b/src/datasource/graphene/backend.ts index b49783b22d..886a022e0d 100644 --- a/src/datasource/graphene/backend.ts +++ b/src/datasource/graphene/backend.ts @@ -22,20 +22,23 @@ import { ChunkSource, } from "#src/chunk_manager/backend.js"; import { ChunkPriorityTier, ChunkState } from "#src/chunk_manager/base.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import type { ChunkedGraphChunkSpecification } from "#src/datasource/graphene/base.js"; import { getGrapheneFragmentKey, GRAPHENE_MESH_NEW_SEGMENT_RPC_ID, - responseIdentity, ChunkedGraphSourceParameters, MeshSourceParameters, CHUNKED_GRAPH_LAYER_RPC_ID, CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, RENDER_RATIO_LIMIT, isBaseSegmentId, + parseGrapheneError, + getHttpSource, } from "#src/datasource/graphene/base.js"; import { decodeManifestChunk } from "#src/datasource/precomputed/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { KvStoreWithPath, ReadResponse } from "#src/kvstore/index.js"; +import { readKvStore } from "#src/kvstore/index.js"; import type { FragmentChunk, ManifestChunk } from "#src/mesh/backend.js"; import { assignMeshFragmentData, MeshSource } from "#src/mesh/backend.js"; import { decodeDraco } from "#src/mesh/draco/index.js"; @@ -60,15 +63,8 @@ import { } from "#src/sliceview/base.js"; import { computeChunkBounds } from "#src/sliceview/volume/backend.js"; import { Uint64Set } from "#src/uint64_set.js"; -import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { vec3, vec3Key } from "#src/util/geom.js"; -import { responseArrayBuffer, responseJson } from "#src/util/http_request.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; +import { HttpError } from "#src/util/http_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { getBasePriority, @@ -78,77 +74,68 @@ import { import type { RPC } from "#src/worker_rpc.js"; import { registerSharedObject, registerRPC } from "#src/worker_rpc.js"; -function getVerifiedFragmentPromise( - credentialsProvider: SpecialProtocolCredentialsProvider, - chunk: FragmentChunk, - parameters: MeshSourceParameters, - cancellationToken: CancellationToken, -) { - if (chunk.fragmentId && chunk.fragmentId.charAt(0) === "~") { - const parts = chunk.fragmentId.substr(1).split(":"); - const startOffset = Number(parts[1]); - const endOffset = startOffset + Number(parts[2]); - return fetchSpecialHttpByteRange( - credentialsProvider, - `${parameters.fragmentUrl}/initial/${parts[0]}`, - startOffset, - endOffset, - cancellationToken, +function downloadFragmentWithSharding( + fragmentKvStore: KvStoreWithPath, + fragmentId: string, + signal: AbortSignal, +): Promise { + if (fragmentId && fragmentId.charAt(0) === "~") { + const parts = fragmentId.substring(1).split(":"); + const byteRange = { offset: Number(parts[1]), length: Number(parts[2]) }; + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}initial/${parts[0]}`, + { signal, byteRange, throwIfMissing: true }, ); } - return cancellableFetchSpecialOk( - credentialsProvider, - `${parameters.fragmentUrl}/dynamic/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}dynamic/${fragmentId}`, + { signal, throwIfMissing: true }, ); } -function getFragmentDownloadPromise( - credentialsProvider: SpecialProtocolCredentialsProvider, - chunk: FragmentChunk, +function downloadFragment( + fragmentKvStore: KvStoreWithPath, + fragmentId: string, parameters: MeshSourceParameters, - cancellationToken: CancellationToken, -) { - let fragmentDownloadPromise; + signal: AbortSignal, +): Promise { if (parameters.sharding) { - fragmentDownloadPromise = getVerifiedFragmentPromise( - credentialsProvider, - chunk, - parameters, - cancellationToken, - ); + return downloadFragmentWithSharding(fragmentKvStore, fragmentId, signal); } else { - fragmentDownloadPromise = cancellableFetchSpecialOk( - credentialsProvider, - `${parameters.fragmentUrl}/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, + return readKvStore( + fragmentKvStore.store, + `${fragmentKvStore.path}/${fragmentId}`, + { signal, throwIfMissing: true }, ); } - return fragmentDownloadPromise; } async function decodeDracoFragmentChunk( chunk: FragmentChunk, - response: ArrayBuffer, + response: Uint8Array, ) { - const rawMesh = await decodeDraco(new Uint8Array(response)); + const rawMesh = await decodeDraco(response); assignMeshFragmentData(chunk, rawMesh); } @registerSharedObject() export class GrapheneMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MeshSource, - ), + WithSharedKvStoreContextCounterpart(MeshSource), MeshSourceParameters, ) { manifestRequestCount = new Map(); newSegments = new Uint64Set(); + manifestHttpSource = getHttpSource( + this.sharedKvStoreContext.kvStoreContext, + this.parameters.manifestUrl, + ); + fragmentKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.fragmentUrl, + ); + addNewSegment(segment: Uint64) { const { newSegments } = this; newSegments.add(segment); @@ -158,53 +145,46 @@ export class GrapheneMeshSource extends WithParameters( }, TEN_MINUTES); } - async download(chunk: ManifestChunk, cancellationToken: CancellationToken) { + async download(chunk: ManifestChunk, signal: AbortSignal) { const { parameters, newSegments, manifestRequestCount } = this; if (isBaseSegmentId(chunk.objectId, parameters.nBitsForLayerId)) { return decodeManifestChunk(chunk, { fragments: [] }); } - const url = `${parameters.manifestUrl}/manifest`; - const manifestUrl = `${url}/${chunk.objectId}:${parameters.lod}?verify=1&prepend_seg_ids=1`; - await cancellableFetchSpecialOk( - this.credentialsProvider, - manifestUrl, - {}, - responseJson, - cancellationToken, - ).then((response) => { - const chunkIdentifier = manifestUrl; - if (newSegments.has(chunk.objectId)) { - const requestCount = - (manifestRequestCount.get(chunkIdentifier) || 0) + 1; - manifestRequestCount.set(chunkIdentifier, requestCount); - setTimeout( - () => { - this.chunkManager.queueManager.updateChunkState( - chunk, - ChunkState.QUEUED, - ); - }, - 2 ** requestCount * 1000, - ); - } else { - manifestRequestCount.delete(chunkIdentifier); - } - return decodeManifestChunk(chunk, response); - }); + const { fetchOkImpl, baseUrl } = this.manifestHttpSource; + const manifestPath = `/manifest/${chunk.objectId}:${parameters.lod}?verify=1&prepend_seg_ids=1`; + const response = await ( + await fetchOkImpl(baseUrl + manifestPath, { signal }) + ).json(); + const chunkIdentifier = manifestPath; + if (newSegments.has(chunk.objectId)) { + const requestCount = (manifestRequestCount.get(chunkIdentifier) ?? 0) + 1; + manifestRequestCount.set(chunkIdentifier, requestCount); + setTimeout( + () => { + this.chunkManager.queueManager.updateChunkState( + chunk, + ChunkState.QUEUED, + ); + }, + 2 ** requestCount * 1000, + ); + } else { + manifestRequestCount.delete(chunkIdentifier); + } + return decodeManifestChunk(chunk, response); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { - const { parameters } = this; - const response = await getFragmentDownloadPromise( - undefined, + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { + const { response } = await downloadFragment( + this.fragmentKvStore, + chunk.fragmentId!, + this.parameters, + signal, + ); + await decodeDracoFragmentChunk( chunk, - parameters, - cancellationToken, + new Uint8Array(await response.arrayBuffer()), ); - await decodeDracoFragmentChunk(chunk, response); } getFragmentKey(objectKey: string | null, fragmentId: string) { @@ -262,16 +242,19 @@ function decodeChunkedGraphChunk(leaves: string[]) { @registerSharedObject() export class GrapheneChunkedGraphChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - ChunkSource, - ), + WithSharedKvStoreContextCounterpart(ChunkSource), ChunkedGraphSourceParameters, ) { spec: ChunkedGraphChunkSpecification; - chunks: Map; + declare chunks: Map; tempChunkDataSize: Uint32Array; tempChunkPosition: Float32Array; + httpSource = getHttpSource( + this.sharedKvStoreContext.kvStoreContext, + this.parameters.url, + ); + constructor(rpc: RPC, options: any) { super(rpc, options); this.spec = options.spec; @@ -280,11 +263,7 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( this.tempChunkPosition = new Float32Array(rank); } - async download( - chunk: ChunkedGraphChunk, - cancellationToken: CancellationToken, - ): Promise { - const { parameters } = this; + async download(chunk: ChunkedGraphChunk, signal: AbortSignal): Promise { const chunkPosition = this.computeChunkBounds(chunk); const chunkDataSize = chunk.chunkDataSize!; const bounds = @@ -292,12 +271,10 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( `${chunkPosition[1]}-${chunkPosition[1] + chunkDataSize[1]}_` + `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; - const request = cancellableFetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.segment}/leaves?int64_as_str=1&bounds=${bounds}`, - {}, - responseIdentity, - cancellationToken, + const { fetchOkImpl, baseUrl } = this.httpSource; + const request = fetchOkImpl( + `${baseUrl}/${chunk.segment}/leaves?int64_as_str=1&bounds=${bounds}`, + { signal }, ); await this.withErrorMessage( request, @@ -307,7 +284,10 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( .then((res) => { chunk.leaves = decodeChunkedGraphChunk(res.leaf_ids); }) - .catch((err) => console.error(err)); + .catch((err) => { + if (err instanceof Error && err.name === "AbortError") return; + console.error(err); + }); } getChunk(chunkGridPosition: Float32Array, segment: Uint64) { @@ -326,21 +306,17 @@ export class GrapheneChunkedGraphChunkSource extends WithParameters( return computeChunkBounds(this, chunk); } - async withErrorMessage( - promise: Promise, + async withErrorMessage( + promise: Promise, errorPrefix: string, - ): Promise { - const response = await promise; - if (response.ok) { - return response; - } - let msg: string; - try { - msg = (await response.json()).message; - } catch { - msg = await response.text(); - } - throw new Error(`[${response.status}] ${errorPrefix}${msg}`); + ): Promise { + return promise.catch(async (e) => { + if (e instanceof HttpError && e.response) { + const msg = await parseGrapheneError(e); + throw new Error(`[${e.response.status}] ${errorPrefix}${msg ?? ""}`); + } + throw e; + }); } } diff --git a/src/datasource/graphene/base.ts b/src/datasource/graphene/base.ts index 52048f98db..e8ec485731 100644 --- a/src/datasource/graphene/base.ts +++ b/src/datasource/graphene/base.ts @@ -15,6 +15,9 @@ */ import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; +import type { KvStoreContext } from "#src/kvstore/context.js"; +import { ReadableHttpKvStore } from "#src/kvstore/http/common.js"; +import { joinBaseUrlAndPath } from "#src/kvstore/url.js"; import type { ChunkLayoutOptions, SliceViewChunkSource, @@ -25,7 +28,7 @@ import type { } from "#src/sliceview/base.js"; import { makeSliceViewChunkSpecification } from "#src/sliceview/base.js"; import type { mat4 } from "#src/util/geom.js"; - +import type { FetchOk, HttpError } from "#src/util/http_request.js"; import { Uint64 } from "#src/util/uint64.js"; export const PYCG_APP_VERSION = 1; @@ -68,8 +71,6 @@ export class MultiscaleMeshMetadata { sharding: Array | undefined; } -export const responseIdentity = async (x: any) => x; - export function isBaseSegmentId(segmentId: Uint64, nBitsForLayerId: number) { const layerId = Uint64.rshift(new Uint64(), segmentId, 64 - nBitsForLayerId); return Uint64.equal(layerId, Uint64.ONE); @@ -139,3 +140,36 @@ export function makeChunkedGraphChunkSpecification( export interface ChunkedGraphChunkSource extends SliceViewChunkSource { spec: ChunkedGraphChunkSpecification; } + +export async function parseGrapheneError(e: HttpError) { + if (e.response) { + let msg: string; + if (e.response.headers.get("content-type") === "application/json") { + msg = (await e.response.json()).message; + } else { + msg = await e.response.text(); + } + return msg; + } + return undefined; +} + +export interface HttpSource { + fetchOkImpl: FetchOk; + baseUrl: string; +} + +export function getHttpSource( + kvStoreContext: KvStoreContext, + url: string, +): HttpSource { + const { store, path } = kvStoreContext.getKvStore(url); + if (!(store instanceof ReadableHttpKvStore)) { + throw new Error(`Non-HTTP URL ${JSON.stringify(url)} not supported`); + } + const { fetchOkImpl, baseUrl } = store; + if (baseUrl.includes("?")) { + throw new Error(`Invalid URL ${baseUrl}: query parameters not supported`); + } + return { fetchOkImpl, baseUrl: joinBaseUrlAndPath(baseUrl, path) }; +} diff --git a/src/datasource/graphene/frontend.ts b/src/datasource/graphene/frontend.ts index 04a1281b69..a0c1669020 100644 --- a/src/datasource/graphene/frontend.ts +++ b/src/datasource/graphene/frontend.ts @@ -34,14 +34,14 @@ import { LayerChunkProgressInfo } from "#src/chunk_manager/base.js"; import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeIdentityTransform } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; import type { ChunkedGraphChunkSource as ChunkedGraphChunkSourceInterface, ChunkedGraphChunkSpecification, + HttpSource, MultiscaleMeshMetadata, } from "#src/datasource/graphene/base.js"; import { + parseGrapheneError, CHUNKED_GRAPH_LAYER_RPC_ID, CHUNKED_GRAPH_RENDER_LAYER_UPDATE_SOURCES_RPC_ID, ChunkedGraphSourceParameters, @@ -51,14 +51,15 @@ import { makeChunkedGraphChunkSpecification, MeshSourceParameters, PYCG_APP_VERSION, - responseIdentity, + getHttpSource, } from "#src/datasource/graphene/base.js"; import type { DataSource, + DataSourceLookupResult, DataSubsourceEntry, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { RedirectError } from "#src/datasource/index.js"; import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { DataEncoding, @@ -68,11 +69,15 @@ import type { MultiscaleVolumeInfo } from "#src/datasource/precomputed/frontend. import { getSegmentPropertyMap, parseMultiscaleVolumeInfo, - parseProviderUrl, - PrecomputedDataSource, PrecomputedMultiscaleVolumeChunkSource, - resolvePath, } from "#src/datasource/precomputed/frontend.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + ensureEmptyUrlSuffix, + kvstoreEnsureDirectoryPipelineUrl, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { LayerView, MouseSelectionState, @@ -161,11 +166,7 @@ import type { ValueOrError } from "#src/util/error.js"; import { makeValueOrError, valueOrThrow } from "#src/util/error.js"; import { EventActionMap } from "#src/util/event_action_map.js"; import { mat4, vec3, vec4 } from "#src/util/geom.js"; -import { - HttpError, - isNotFoundError, - responseJson, -} from "#src/util/http_request.js"; +import { HttpError, isNotFoundError } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -183,16 +184,9 @@ import { verifyPositiveInt, verifyString, } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; import { Uint64 } from "#src/util/uint64.js"; import { makeDeleteButton } from "#src/widget/delete_button.js"; @@ -218,7 +212,7 @@ const TRANSPARENT_COLOR_PACKED = new Uint64(packColor(TRANSPARENT_COLOR)); const MULTICUT_OFF_COLOR = vec4.fromValues(0, 0, 0, 0.5); class GrapheneMeshSource extends WithParameters( - WithCredentialsProvider()(MeshSource), + WithSharedKvStoreContext(MeshSource), MeshSourceParameters, ) { getFragmentKey(objectKey: string | null, fragmentId: string) { @@ -235,7 +229,7 @@ class AppInfo { // .../1.0/... is the legacy link style // .../table/... is the current, version agnostic link style (for retrieving the info file) const linkStyle = - /^(https?:\/\/[.\w:\-/]+)\/segmentation\/(?:1\.0|table)\/([^/]+)\/?$/; + /^((?:middleauth\+)?https?:\/\/[.\w:\-/]+)\/segmentation\/(?:1\.0|table)\/([^/]+)\/?$/; const match = infoUrl.match(linkStyle); if (match === null) { throw Error(`Graph URL invalid: ${infoUrl}`); @@ -250,11 +244,11 @@ class AppInfo { "supported_api_versions", (x) => parseArray(x, verifyNonnegativeInt), ); - } catch (error) { + } catch { // Dealing with a prehistoric graph server with no version information this.supported_api_versions = [0]; } - if (PYCG_APP_VERSION in this.supported_api_versions === false) { + if (this.supported_api_versions.includes(PYCG_APP_VERSION) === false) { const redirectMsg = `This Neuroglancer branch requires Graph Server version ${PYCG_APP_VERSION}, but the server only supports version(s) ${this.supported_api_versions}.`; throw new Error(redirectMsg); } @@ -289,12 +283,9 @@ interface GrapheneMultiscaleVolumeInfo extends MultiscaleVolumeInfo { function parseGrapheneMultiscaleVolumeInfo( obj: unknown, url: string, - credentialsManager: CredentialsManager, ): GrapheneMultiscaleVolumeInfo { const volumeInfo = parseMultiscaleVolumeInfo(obj); - const dataUrl = verifyObjectProperty(obj, "data_dir", (x) => - parseSpecialUrl(x, credentialsManager), - ).url; + const dataUrl = verifyObjectProperty(obj, "data_dir", verifyString); const app = verifyObjectProperty(obj, "app", (x) => new AppInfo(url, x)); const graph = verifyObjectProperty(obj, "graph", (x) => new GraphInfo(x)); return { @@ -307,11 +298,10 @@ function parseGrapheneMultiscaleVolumeInfo( class GrapheneMultiscaleVolumeChunkSource extends PrecomputedMultiscaleVolumeChunkSource { constructor( - chunkManager: ChunkManager, - public chunkedGraphCredentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, public info: GrapheneMultiscaleVolumeInfo, ) { - super(chunkManager, undefined, info.dataUrl, info); + super(sharedKvStoreContext, info.dataUrl, info); } getChunkedGraphSource() { @@ -346,7 +336,7 @@ class GrapheneMultiscaleVolumeChunkSource extends PrecomputedMultiscaleVolumeChu GrapheneChunkedGraphChunkSource, { spec, - credentialsProvider: this.chunkedGraphCredentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, parameters: { url: `${this.info.app!.segmentationUrl}/node` }, }, ), @@ -435,13 +425,18 @@ function parseMeshMetadata(data: any): ParsedMeshMetadata { } async function getMeshMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { let metadata: any; try { - metadata = await getJsonMetadata(chunkManager, credentialsProvider, url); + metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ false, + options, + ); } catch (e) { if (isNotFoundError(e)) { // If we fail to fetch the info file, assume it is the legacy @@ -517,27 +512,26 @@ function parseGrapheneShardingParameters( } function getShardedMeshSource( - chunkManager: ChunkManager, + sharedKvStoreContext: SharedKvStoreContext, parameters: MeshSourceParameters, - credentialsProvider: SpecialProtocolCredentialsProvider, ) { - return chunkManager.getChunkSource(GrapheneMeshSource, { + return sharedKvStoreContext.chunkManager.getChunkSource(GrapheneMeshSource, { + sharedKvStoreContext, parameters, - credentialsProvider, }); } async function getMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, fragmentUrl: string, nBitsForLayerId: number, + options: ProgressOptions, ) { const { metadata, segmentPropertyMap } = await getMeshMetadata( - chunkManager, - undefined, + sharedKvStoreContext, fragmentUrl, + options, ); const parameters: MeshSourceParameters = { manifestUrl: url, @@ -548,30 +542,35 @@ async function getMeshSource( }; const transform = metadata?.transform || mat4.create(); return { - source: getShardedMeshSource(chunkManager, parameters, credentialsProvider), + source: getShardedMeshSource(sharedKvStoreContext, parameters), transform, segmentPropertyMap, }; } -function getJsonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, +export function getJsonMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, + required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { - type: "graphene:metadata", + type: "precomputed:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/info`, - {}, - responseJson, - ); + options, + async (options) => { + const infoUrl = pipelineUrlJoin(url, "info"); + using _span = new ProgressSpan(options.progressListener, { + message: `Reading graphene metadata from ${infoUrl}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(infoUrl, { + ...options, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -586,31 +585,22 @@ function getSubsourceToModelSubspaceTransform(info: MultiscaleVolumeInfo) { } async function getVolumeDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, + options: ProgressOptions, + stateJson: any, ): Promise { - const info = parseGrapheneMultiscaleVolumeInfo( - metadata, - url, - options.credentialsManager, - ); + const info = parseGrapheneMultiscaleVolumeInfo(metadata, url); const volume = new GrapheneMultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, info, ); const state = new GrapheneState(); - if (options.state) { - state.restoreState(options.state); + if (stateJson) { + state.restoreState(stateJson); } - const segmentationGraph = new GrapheneGraphSource( - info, - credentialsProvider, - volume, - state, - ); + const segmentationGraph = new GrapheneGraphSource(info, volume, state); const { modelSpace } = info; const subsources: DataSubsourceEntry[] = [ { @@ -634,18 +624,19 @@ async function getVolumeDataSource( }, ]; if (info.segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, info.segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.segmentPropertyMap, + ), ); - const segmentPropertyMap = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMap = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -654,11 +645,16 @@ async function getVolumeDataSource( } if (info.mesh !== undefined) { const { source: meshSource, transform } = await getMeshSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, info.app!.meshingUrl, - resolvePath(info.dataUrl, info.mesh), + kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + info.dataUrl, + info.mesh, + ), + ), info.graph.nBitsForLayerId, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -681,56 +677,56 @@ async function getVolumeDataSource( }; } -export class GrapheneDataSource extends PrecomputedDataSource { - get description() { - return "Graphene file-backed data source"; +// Note: Graphene is not really a kvstore-based data source, since it relies on +// making arbitrary HTTP requests rather than just kvstore. It fails if the +// provided kvstore does not inherit from HttpKvStore. +export class GrapheneDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "graphene"; } - - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, - ); - return options.chunkManager.memoize.getUncounted( - { type: "graphene:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, + get description() { + return "Graphene data source"; + } + + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + ensureEmptyUrlSuffix(options.url); + const url = kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl); + return options.registry.chunkManager.memoize.getAsync( + { type: "graphene:get", url }, + options, + async (progressOptions) => { + const metadata = await getJsonMetadata( + options.registry.sharedKvStoreContext, + url, + /*required=*/ true, + progressOptions, ); - let metadata: any; - try { - metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - url, - ); - } catch (e) { - if (isNotFoundError(e)) { - if (parameters.type === "mesh") { - console.log("does this happen?"); - } - } - throw e; - } verifyObject(metadata); const redirect = verifyOptionalObjectProperty( metadata, "redirect", verifyString, ); + const canonicalUrl = `${options.url.scheme}://${url}`; if (redirect !== undefined) { - throw new RedirectError(redirect); + return { canonicalUrl, targetUrl: redirect }; } const t = verifyOptionalObjectProperty(metadata, "@type", verifyString); switch (t) { case "neuroglancer_multiscale_volume": - case undefined: - return await getVolumeDataSource( - options, - credentialsProvider, + case undefined: { + const dataSource = await getVolumeDataSource( + options.registry.sharedKvStoreContext, url, metadata, + progressOptions, + options.state, ); + dataSource.canonicalUrl = canonicalUrl; + return dataSource; + } default: throw new Error(`Invalid type: ${JSON.stringify(t)}`); } @@ -1544,26 +1540,13 @@ class GraphConnection extends SegmentationGraphSourceConnection { } } -async function parseGrapheneError(e: HttpError) { - if (e.response) { - let msg: string; - if (e.response.headers.get("content-type") === "application/json") { - msg = (await e.response.json()).message; - } else { - msg = await e.response.text(); - } - return msg; - } - return undefined; -} - -async function withErrorMessageHTTP( - promise: Promise, +async function withErrorMessageHTTP( + promise: Promise, options: { initialMessage?: string; errorPrefix: string; }, -): Promise { +): Promise { let status: StatusMessage | undefined = undefined; let dispose = () => {}; if (options.initialMessage) { @@ -1595,30 +1578,28 @@ async function withErrorMessageHTTP( export const GRAPH_SERVER_NOT_SPECIFIED = Symbol("Graph Server Not Specified."); class GrapheneGraphServerInterface { - constructor( - private url: string, - private credentialsProvider: SpecialProtocolCredentialsProvider, - ) {} + private httpSource: HttpSource; + constructor(sharedKvStoreContext: SharedKvStoreContext, url: string) { + this.httpSource = getHttpSource(sharedKvStoreContext.kvStoreContext, url); + } async getRoot(segment: Uint64, timestamp = "") { const timestampEpoch = new Date(timestamp).valueOf() / 1000; - const url = `${this.url}/node/${String(segment)}/root?int64_as_str=1${ - Number.isNaN(timestampEpoch) ? "" : `×tamp=${timestampEpoch}` - }`; + const { fetchOkImpl, baseUrl } = this.httpSource; - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseIdentity, + const jsonResp = await withErrorMessageHTTP( + fetchOkImpl( + `${baseUrl}/node/${String(segment)}/root?int64_as_str=1${ + Number.isNaN(timestampEpoch) ? "" : `×tamp=${timestampEpoch}` + }`, + {}, + ).then((response) => response.json()), + { + initialMessage: `Retrieving root for segment ${segment}`, + errorPrefix: "Could not fetch root: ", + }, ); - - const response = await withErrorMessageHTTP(promise, { - initialMessage: `Retrieving root for segment ${segment}`, - errorPrefix: "Could not fetch root: ", - }); - const jsonResp = await response.json(); return Uint64.parseString(jsonResp.root_id); } @@ -1627,29 +1608,20 @@ class GrapheneGraphServerInterface { second: SegmentSelection, annotationToNanometers: Float64Array, ): Promise { - const { url } = this; - if (url === "") { - return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); - } - - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - `${url}/merge?int64_as_str=1`, - { - method: "POST", - body: JSON.stringify([ - [ - String(first.segmentId), - ...first.position.map((val, i) => val * annotationToNanometers[i]), - ], - [ - String(second.segmentId), - ...second.position.map((val, i) => val * annotationToNanometers[i]), - ], - ]), - }, - responseIdentity, - ); + const { fetchOkImpl, baseUrl } = this.httpSource; + const promise = fetchOkImpl(`${baseUrl}/merge?int64_as_str=1`, { + method: "POST", + body: JSON.stringify([ + [ + String(first.segmentId), + ...first.position.map((val, i) => val * annotationToNanometers[i]), + ], + [ + String(second.segmentId), + ...second.position.map((val, i) => val * annotationToNanometers[i]), + ], + ]), + }); try { const response = await promise; @@ -1669,29 +1641,20 @@ class GrapheneGraphServerInterface { second: SegmentSelection[], annotationToNanometers: Float64Array, ): Promise { - const { url } = this; - if (url === "") { - return Promise.reject(GRAPH_SERVER_NOT_SPECIFIED); - } - - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - `${url}/split?int64_as_str=1`, - { - method: "POST", - body: JSON.stringify({ - sources: first.map((x) => [ - String(x.segmentId), - ...x.position.map((val, i) => val * annotationToNanometers[i]), - ]), - sinks: second.map((x) => [ - String(x.segmentId), - ...x.position.map((val, i) => val * annotationToNanometers[i]), - ]), - }), - }, - responseIdentity, - ); + const { fetchOkImpl, baseUrl } = this.httpSource; + const promise = fetchOkImpl(`${baseUrl}/split?int64_as_str=1`, { + method: "POST", + body: JSON.stringify({ + sources: first.map((x) => [ + String(x.segmentId), + ...x.position.map((val, i) => val * annotationToNanometers[i]), + ]), + sinks: second.map((x) => [ + String(x.segmentId), + ...x.position.map((val, i) => val * annotationToNanometers[i]), + ]), + }), + }); const response = await withErrorMessageHTTP(promise, { initialMessage: `Splitting ${first.length} sources from ${second.length} sinks`, @@ -1706,25 +1669,23 @@ class GrapheneGraphServerInterface { } async filterLatestRoots(segments: Uint64[]): Promise { - const url = `${this.url}/is_latest_roots`; + const { fetchOkImpl, baseUrl } = this.httpSource; + const url = `${baseUrl}/is_latest_roots`; - const promise = cancellableFetchSpecialOk( - this.credentialsProvider, - url, + const promise = fetchOkImpl(url, { + method: "POST", + body: JSON.stringify({ + node_ids: segments.map((x) => x.toJSON()), + }), + }); + + const jsonResp = await withErrorMessageHTTP( + promise.then((response) => response.json()), { - method: "POST", - body: JSON.stringify({ - node_ids: segments.map((x) => x.toJSON()), - }), + errorPrefix: "Could not check latest: ", }, - responseIdentity, ); - const response = await withErrorMessageHTTP(promise, { - errorPrefix: "Could not check latest: ", - }); - const jsonResp = await response.json(); - const res: Uint64[] = []; for (const [i, isLatest] of jsonResp.is_latest.entries()) { if (isLatest) { @@ -1741,14 +1702,13 @@ class GrapheneGraphSource extends SegmentationGraphSource { constructor( public info: GrapheneMultiscaleVolumeInfo, - credentialsProvider: SpecialProtocolCredentialsProvider, private chunkSource: GrapheneMultiscaleVolumeChunkSource, public state: GrapheneState, ) { super(); this.graphServer = new GrapheneGraphServerInterface( + chunkSource.sharedKvStoreContext, info.app!.segmentationUrl, - credentialsProvider, ); } @@ -1842,14 +1802,12 @@ class ChunkedGraphChunkSource extends SliceViewChunkSource implements ChunkedGraphChunkSourceInterface { - spec: ChunkedGraphChunkSpecification; - OPTIONS: { spec: ChunkedGraphChunkSpecification }; + declare spec: ChunkedGraphChunkSpecification; + declare OPTIONS: { spec: ChunkedGraphChunkSpecification }; } class GrapheneChunkedGraphChunkSource extends WithParameters( - WithCredentialsProvider()( - ChunkedGraphChunkSource, - ), + WithSharedKvStoreContext(ChunkedGraphChunkSource), ChunkedGraphSourceParameters, ) {} @@ -1995,14 +1953,12 @@ const GRAPHENE_MULTICUT_SEGMENTS_TOOL_ID = "grapheneMulticutSegments"; const GRAPHENE_MERGE_SEGMENTS_TOOL_ID = "grapheneMergeSegments"; class MulticutAnnotationLayerView extends AnnotationLayerView { - private _annotationStates: MergedAnnotationStates; - + declare private _annotationStates: MergedAnnotationStates; constructor( public layer: SegmentationUserLayer, public displayState: AnnotationDisplayState, ) { super(layer, displayState); - const { graphConnection: { value: graphConnection }, } = layer; diff --git a/src/datasource/graphene/register_default.ts b/src/datasource/graphene/register_default.ts index e256a146fb..a0532a80b6 100644 --- a/src/datasource/graphene/register_default.ts +++ b/src/datasource/graphene/register_default.ts @@ -16,5 +16,8 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { GrapheneDataSource } from "#src/datasource/graphene/frontend.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; -registerProvider("graphene", () => new GrapheneDataSource()); +registerProvider( + new KvStoreBasedDataSourceLegacyUrlAdapter(new GrapheneDataSource()), +); diff --git a/src/datasource/index.ts b/src/datasource/index.ts index e1cc361c05..b377542916 100644 --- a/src/datasource/index.ts +++ b/src/datasource/index.ts @@ -22,12 +22,21 @@ import type { CoordinateSpaceTransform, CoordinateTransformSpecification, } from "#src/coordinate_transform.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import type { LocalDataSource } from "#src/datasource/local.js"; import { - emptyValidCoordinateSpace, - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; + AutoDetectRegistry, + autoDetectFormat, +} from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { + extractQueryAndFragment, + finalPipelineUrlComponent, + parsePipelineUrlComponent, + splitPipelineUrl, +} from "#src/kvstore/url.js"; import type { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import type { SegmentPropertyMap } from "#src/segmentation_display_state/property_map.js"; import type { SegmentationGraphSource } from "#src/segmentation_graph/source.js"; @@ -35,29 +44,21 @@ import type { SingleMeshSource } from "#src/single_mesh/frontend.js"; import type { SkeletonSource } from "#src/skeleton/frontend.js"; import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import type { BasicCompletionResult, CompletionWithDescription, } from "#src/util/completion.js"; import { applyCompletionOffset, + emptyCompletionResult, getPrefixMatchesWithDescriptions, } from "#src/util/completion.js"; -import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; -import { createIdentity } from "#src/util/matrix.js"; +import { type ProgressOptions } from "#src/util/progress_listener.js"; import type { Trackable } from "#src/util/trackable.js"; export type CompletionResult = BasicCompletionResult; -export class RedirectError extends Error { - constructor(public redirectTarget: string) { - super(`Redirected to: ${redirectTarget}`); - } -} - /** * Returns the length of the prefix of path that corresponds to the "group", according to the * specified separator. @@ -95,9 +96,7 @@ export function suggestLayerNameBasedOnSeparator( return path.substring(groupIndex); } -export interface GetDataSourceOptionsBase { - chunkManager: ChunkManager; - cancellationToken?: CancellationToken; +export interface GetDataSourceOptionsBase extends Partial { url: string; transform: CoordinateTransformSpecification | undefined; globalCoordinateSpace: WatchableValueInterface; @@ -105,11 +104,10 @@ export interface GetDataSourceOptionsBase { } export interface GetDataSourceOptions extends GetDataSourceOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - cancellationToken: CancellationToken; - providerProtocol: string; - credentialsManager: CredentialsManager; + signal: AbortSignal; + providerScheme: string; } export interface ConvertLegacyUrlOptionsBase { @@ -118,24 +116,9 @@ export interface ConvertLegacyUrlOptionsBase { } export interface ConvertLegacyUrlOptions extends ConvertLegacyUrlOptionsBase { - registry: DataSourceProviderRegistry; - providerUrl: string; - providerProtocol: string; -} - -export interface NormalizeUrlOptionsBase { - url: string; -} - -export interface NormalizeUrlOptions extends NormalizeUrlOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - providerProtocol: string; -} - -export enum LocalDataSource { - annotations = 0, - equivalences = 1, + providerScheme: string; } export interface DataSubsource { @@ -149,17 +132,14 @@ export interface DataSubsource { segmentationGraph?: SegmentationGraphSource; } -export interface CompleteUrlOptionsBase { +export interface CompleteUrlOptionsBase extends Partial { url: string; - cancellationToken?: CancellationToken; - chunkManager: ChunkManager; } export interface CompleteUrlOptions extends CompleteUrlOptionsBase { - registry: DataSourceProviderRegistry; + registry: DataSourceRegistry; providerUrl: string; - cancellationToken: CancellationToken; - credentialsManager: CredentialsManager; + signal: AbortSignal; } export interface DataSubsourceEntry { @@ -198,20 +178,23 @@ export interface DataSource { modelTransform: CoordinateSpaceTransform; canChangeModelSpaceRank?: boolean; state?: Trackable; + canonicalUrl?: string; } -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging -export interface DataSourceProvider { - /** - * Returns a suggested layer name for the given volume source. - */ - suggestLayerName?(path: string): string; +export interface DataSourceRedirect { + // Canonical URL of the source. + canonicalUrl?: string; - /** - * Returns the length of the prefix of path that is its 'group'. This is used for suggesting a - * default URL for adding a new layer. - */ - findSourceGroup?(path: string): number; + // Target URL. + targetUrl: string; +} + +export type DataSourceLookupResult = DataSource | DataSourceRedirect; + +export interface DataSourceWithRedirectInfo extends DataSource { + // Canonical URL prior to any redirects. + originalCanonicalUrl?: string; + redirectLog: Set; } export interface DataSubsourceSpecification { @@ -224,6 +207,9 @@ export interface DataSourceSpecification { enableDefaultSubsources: boolean; subsources: Map; state?: any; + + // Indicates that the spec was set manually in the UI. + setManually?: boolean; } export function makeEmptyDataSourceSpecification(): DataSourceSpecification { @@ -235,220 +221,234 @@ export function makeEmptyDataSourceSpecification(): DataSourceSpecification { }; } -// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging -export abstract class DataSourceProvider extends RefCounted { - abstract description?: string; +export interface DataSourceProvider { + scheme: string; + description?: string; + // Exclude from completion list. + hidden?: boolean; - abstract get(options: GetDataSourceOptions): Promise; + get(options: GetDataSourceOptions): Promise; - normalizeUrl(options: NormalizeUrlOptions): string { - return options.url; - } + convertLegacyUrl?: (options: ConvertLegacyUrlOptions) => string; - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - return options.url; - } + completeUrl?: (options: CompleteUrlOptions) => Promise; +} - async completeUrl(options: CompleteUrlOptions): Promise { - options; - throw null; - } +export interface KvStoreBasedDataSourceProvider { + scheme: string; + description?: string; + singleFile?: boolean; + expectsDirectory?: boolean; + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise; + completeUrl?: ( + options: GetKvStoreBasedDataSourceOptions, + ) => Promise; } -export const localAnnotationsUrl = "local://annotations"; -export const localEquivalencesUrl = "local://equivalences"; +export interface GetKvStoreBasedDataSourceOptions + extends Partial { + registry: DataSourceRegistry; + kvStoreUrl: string; + url: UrlWithParsedScheme; + state?: any; +} -class LocalDataSourceProvider extends DataSourceProvider { - get description() { - return "Local in-memory"; - } +const schemePattern = /^(?:([a-zA-Z][a-zA-Z0-9-+_]*):\/\/)?(.*)$/; - async get(options: GetDataSourceOptions): Promise { - switch (options.url) { - case localAnnotationsUrl: { - const { transform } = options; - let modelTransform: CoordinateSpaceTransform; - if (transform === undefined) { - const baseSpace = options.globalCoordinateSpace.value; - const { rank, names, scales, units } = baseSpace; - const inputSpace = makeCoordinateSpace({ - rank, - scales, - units, - names: names.map((_, i) => `${i}`), - }); - const outputSpace = makeCoordinateSpace({ - rank, - scales, - units, - names, - }); - modelTransform = { - rank, - sourceRank: rank, - inputSpace, - outputSpace, - transform: createIdentity(Float64Array, rank + 1), - }; - } else { - modelTransform = makeIdentityTransform(emptyValidCoordinateSpace); - } - return { - modelTransform, - canChangeModelSpaceRank: true, - subsources: [ - { - id: "default", - default: true, - subsource: { - local: LocalDataSource.annotations, - }, - }, - ], - }; - } - case localEquivalencesUrl: { - return { - modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), - canChangeModelSpaceRank: false, - subsources: [ - { - id: "default", - default: true, - subsource: { - local: LocalDataSource.equivalences, - }, - }, - ], - }; - } - } - throw new Error("Invalid local data source URL"); +export class DataSourceRegistry extends RefCounted { + get credentialsManager(): SharedCredentialsManager { + return this.sharedKvStoreContext.credentialsManager; } - async completeUrl(options: CompleteUrlOptions) { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - options.providerUrl, - [ - { - value: "annotations", - description: "Annotations stored in the JSON state", - }, - { - value: "equivalences", - description: - "Segmentation equivalence graph stored in the JSON state", - }, - ], - (x) => x.value, - (x) => x.description, - ), - }; + get chunkManager(): ChunkManager { + return this.sharedKvStoreContext.chunkManager; } -} - -const protocolPattern = /^(?:([a-zA-Z][a-zA-Z0-9-+_]*):\/\/)?(.*)$/; -export class DataSourceProviderRegistry extends RefCounted { - constructor(public credentialsManager: CredentialsManager) { + constructor(public sharedKvStoreContext: SharedKvStoreContext) { super(); } - dataSources = new Map>([ - ["local", new LocalDataSourceProvider()], - ]); + dataSources = new Map(); + kvStoreBasedDataSources = new Map(); + autoDetectRegistry = new AutoDetectRegistry(); - register(name: string, dataSource: Owned) { - this.dataSources.set(name, this.registerDisposer(dataSource)); + register(provider: DataSourceProvider) { + this.dataSources.set(provider.scheme, provider); + } + registerKvStoreBasedProvider(provider: KvStoreBasedDataSourceProvider) { + this.kvStoreBasedDataSources.set(provider.scheme, provider); } getProvider(url: string): [DataSourceProvider, string, string] { - const m = url.match(protocolPattern); + const m = url.match(schemePattern); if (m === null || m[1] === undefined) { throw new Error( - `Data source URL must have the form "://".`, + `Data source URL must have the form "://".`, ); } - const [, providerProtocol, providerUrl] = m; - const factory = this.dataSources.get(providerProtocol); + const [, providerScheme, providerUrl] = m; + const factory = this.dataSources.get(providerScheme); if (factory === undefined) { throw new Error( - `Unsupported data source: ${JSON.stringify(providerProtocol)}.`, + `Unsupported data source: ${JSON.stringify(providerScheme)}.`, ); } - return [factory, providerUrl, providerProtocol]; + return [factory, providerUrl, providerScheme]; } - async get(options: GetDataSourceOptionsBase): Promise { - const redirectLog = new Set(); - const { cancellationToken = uncancelableToken } = options; - let url: string = options.url; + private async autoDetectFormat(options: GetDataSourceOptionsBase) { + const { matches, url } = await autoDetectFormat({ + url: options.url, + kvStoreContext: this.sharedKvStoreContext.kvStoreContext, + signal: options.signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + autoDetectFile: () => this.autoDetectRegistry.fileSpec, + }); + if (matches.length !== 1) { + let message: string; + if (matches.length === 0) { + message = "no format detected"; + } else { + message = `multiple formats detected: ${JSON.stringify(matches)}`; + } + throw new Error( + `Failed to auto-detect data source for ${JSON.stringify(options.url)}: ${message}`, + ); + } + return `${url}|${matches[0].suffix}`; + } + + private async resolveKvStoreBasedDataSource( + options: GetDataSourceOptionsBase, + ): Promise { while (true) { - const [provider, providerUrl, providerProtocol] = this.getProvider( - options.url, + const finalPart = parsePipelineUrlComponent( + finalPipelineUrlComponent(options.url), ); - redirectLog.add(options.url); - try { - return provider.get({ + const dataSourceProvider = this.kvStoreBasedDataSources.get( + finalPart.scheme, + ); + if (dataSourceProvider === undefined) { + // Attempt to auto-detect format. + const newUrl = await this.autoDetectFormat(options); + options = { ...options, url: newUrl }; + continue; + } + return await dataSourceProvider.get({ + registry: this, + url: finalPart, + kvStoreUrl: options.url.substring( + 0, + options.url.length - finalPart.url.length - 1, + ), + signal: options.signal, + progressListener: options.progressListener, + state: options.state, + }); + } + } + + private async resolvePipeline( + options: GetDataSourceOptionsBase, + ): Promise { + const pipelineParts = splitPipelineUrl(options.url); + + const basePart = pipelineParts[0]; + const baseScheme = basePart.scheme; + + // Check kvstore providers + { + const provider = + this.sharedKvStoreContext.kvStoreContext.baseKvStoreProviders.get( + baseScheme, + ); + if (provider !== undefined) { + return await this.resolveKvStoreBasedDataSource(options); + } + } + + if (pipelineParts.length !== 1) { + throw new Error(`${baseScheme}: scheme does not support | URL pipelines`); + } + + const suffix = basePart.suffix ?? ""; + if (!suffix.startsWith("//")) { + throw new Error(`${baseScheme}: URLs must start with "${baseScheme}://"`); + } + + const providerUrl = suffix.substring(2); + + // Check non-kvstore-based providers + { + const provider = this.dataSources.get(baseScheme); + if (provider !== undefined) { + return await provider.get({ ...options, - url, - providerProtocol, + url: pipelineParts[0].url, + providerScheme: baseScheme, providerUrl, registry: this, - cancellationToken, - credentialsManager: this.credentialsManager, + signal: options.signal ?? new AbortController().signal, }); - } catch (e) { - if (e instanceof RedirectError) { - const redirect = e.redirectTarget; - if (redirectLog.has(redirect)) { - throw Error( - `Layer source redirection contains loop: ${JSON.stringify( - Array.from(redirectLog), - )}`, - ); - } - if (redirectLog.size >= 10) { - throw Error( - `Too many layer source redirections: ${JSON.stringify( - Array.from(redirectLog), - )}`, - ); - } - url = redirect; - continue; - } - throw e; } } + + throw new Error(`Unsupported scheme: ${baseScheme}:`); } - convertLegacyUrl(options: ConvertLegacyUrlOptionsBase): string { - try { - const [provider, providerUrl, providerProtocol] = this.getProvider( - options.url, - ); - return provider.convertLegacyUrl({ - ...options, - providerUrl, - providerProtocol, - registry: this, - }); - } catch { - return options.url; + async get( + options: GetDataSourceOptionsBase, + ): Promise { + const redirectLog = new Set(); + let url: string = options.url; + url = url.trim(); + // Trim any trailing "|" characters. + url = url.replace(/\|+$/, ""); + let originalCanonicalUrl: string | undefined; + while (true) { + redirectLog.add(url); + const dataSource = await this.resolvePipeline({ ...options, url }); + if (originalCanonicalUrl === undefined) { + originalCanonicalUrl = dataSource.canonicalUrl; + } + if ("targetUrl" in dataSource) { + const { targetUrl } = dataSource; + if (redirectLog.has(targetUrl)) { + throw Error( + `Layer source redirection contains loop: ${JSON.stringify([ + ...redirectLog, + targetUrl, + ])}`, + ); + } + if (redirectLog.size >= 10) { + throw Error( + `Too many layer source redirections: ${JSON.stringify([ + ...redirectLog, + targetUrl, + ])}`, + ); + } + url = targetUrl; + continue; + } + return { ...dataSource, redirectLog, originalCanonicalUrl }; } } - normalizeUrl(options: NormalizeUrlOptionsBase): string { + // Converts legacy precomputed mesh and skeleton datasource URLs. + convertLegacyUrl(options: ConvertLegacyUrlOptionsBase): string { try { - const [provider, providerUrl, providerProtocol] = this.getProvider( + const [provider, providerUrl, providerScheme] = this.getProvider( options.url, ); - return provider.normalizeUrl({ + if (provider.convertLegacyUrl === undefined) return options.url; + return provider.convertLegacyUrl({ ...options, providerUrl, - providerProtocol, + providerScheme: providerScheme, registry: this, }); } catch { @@ -459,52 +459,209 @@ export class DataSourceProviderRegistry extends RefCounted { async completeUrl( options: CompleteUrlOptionsBase, ): Promise { - // Check if url matches a protocol. Note that protocolPattern always matches. - const { url, cancellationToken = uncancelableToken } = options; - const protocolMatch = url.match(protocolPattern)!; - const protocol = protocolMatch[1]; - if (protocol === undefined) { - return Promise.resolve({ - offset: 0, + // Check if url matches a scheme. Note that schemePattern always matches. + const { signal } = options; + + const { url } = options; + + const finalComponent = finalPipelineUrlComponent(url); + const parsedFinalComponent = parsePipelineUrlComponent(finalComponent); + const { scheme } = parsedFinalComponent; + + // Check if we need to complete a scheme. + if ( + finalComponent === url && + !(parsedFinalComponent.suffix ?? "").startsWith("//") + ) { + const providers: { + scheme: string; + description?: string; + }[] = []; + const add = ( + iterable: Iterable, + predicate?: (provider: Provider) => boolean, + ) => { + for (const provider of iterable) { + if (predicate?.(provider) === false) continue; + providers.push(provider); + } + }; + + if (finalComponent === url) { + add( + this.sharedKvStoreContext.kvStoreContext.baseKvStoreProviders.values(), + ); + add(this.dataSources.values(), (provider) => provider.hidden !== true); + } else { + add(this.kvStoreBasedDataSources.values()); + add( + this.sharedKvStoreContext.kvStoreContext.kvStoreAdapterProviders.values(), + ); + } + + const schemeSuffix = finalComponent === url ? "//" : ""; + return { + offset: url.length - finalComponent.length, completions: getPrefixMatchesWithDescriptions( - url, - this.dataSources, - ([name]) => `${name}://`, - ([, factory]) => factory.description, + scheme, + providers, + ({ scheme }) => `${scheme}:${schemeSuffix}`, + ({ description }) => description, ), - }); + }; } - const factory = this.dataSources.get(protocol); - if (factory !== undefined) { - const completions = await factory.completeUrl({ - registry: this, - url, - providerUrl: protocolMatch[2], - chunkManager: options.chunkManager, - cancellationToken, - credentialsManager: this.credentialsManager, + + if (parsedFinalComponent.suffix === undefined) { + const prevPipelineUrl = options.url.substring( + 0, + options.url.length - finalComponent.length - 1, + ); + const { matches } = await autoDetectFormat({ + url: prevPipelineUrl, + kvStoreContext: this.sharedKvStoreContext.kvStoreContext, + signal: options.signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + autoDetectFile: () => this.autoDetectRegistry.fileSpec, }); - return applyCompletionOffset(protocol.length + 3, completions); + if (matches.length === 0) { + throw new Error( + `Failed to auto-detect data source for ${JSON.stringify(prevPipelineUrl)}`, + ); + } + return { + offset: url.length - finalComponent.length, + completions: getPrefixMatchesWithDescriptions( + parsedFinalComponent.scheme, + matches, + ({ suffix }) => suffix, + ({ description }) => description, + ), + }; + } + + if (finalComponent === url) { + // Single component pipeline. + const provider = this.dataSources.get(scheme); + if (provider !== undefined) { + // Non-kvstore-based protocol. + if (provider.completeUrl === undefined) return emptyCompletionResult; + const completions = await provider.completeUrl({ + registry: this, + url: options.url, + providerUrl: parsedFinalComponent.suffix!.substring(2), + signal: signal ?? new AbortController().signal, + progressListener: options.progressListener, + }); + return applyCompletionOffset(scheme.length + 3, completions); + } + } + + { + const provider = this.kvStoreBasedDataSources.get(scheme); + if (provider !== undefined) { + if (provider.completeUrl === undefined) return emptyCompletionResult; + const completions = await provider.completeUrl({ + registry: this, + signal: signal ?? new AbortController().signal, + progressListener: options.progressListener, + kvStoreUrl: url.substring(0, url.length - finalComponent.length - 1), + url: parsedFinalComponent, + }); + return applyCompletionOffset( + url.length - + finalComponent.length + + parsedFinalComponent.scheme.length + + 1, + completions, + ); + } } - throw null; + + return await getKvStoreCompletions(this.sharedKvStoreContext, { + url, + signal, + progressListener: options.progressListener, + autoDetectDirectory: () => this.autoDetectRegistry.directorySpec, + }); } - suggestLayerName(url: string) { - let [dataSource, path] = this.getProvider(url); - if (path.endsWith("/")) { - path = path.substring(0, path.length - 1); + suggestLayerName(url: string): string | undefined { + const parts = splitPipelineUrl(url); + for (let i = parts.length - 1; i >= 0; --i) { + let { suffix } = parts[i]; + if (!suffix) continue; + suffix = suffix.replace(/^\/+/, "").replace(/\/+$/, ""); + if (!suffix) continue; + return suggestLayerNameBasedOnSeparator(suffix); } - const suggestor = dataSource.suggestLayerName; - if (suggestor !== undefined) { - return suggestor(path); + return undefined; + } +} + +export class KvStoreBasedDataSourceLegacyUrlAdapter + implements DataSourceProvider +{ + constructor( + public base: KvStoreBasedDataSourceProvider, + public scheme = base.scheme, + ) {} + + get hidden() { + return true; + } + + get description() { + return this.base.description; + } + + private parseProviderUrl(url: string) { + if (url.includes("|")) { + throw new Error("Only a single pipeline component supported"); } - return suggestLayerNameBasedOnSeparator(path); + const { base, queryAndFragment } = extractQueryAndFragment(url); + return { + kvStoreUrl: base, + queryAndFragment, + url: parsePipelineUrlComponent(`${this.base.scheme}:${queryAndFragment}`), + }; + } + + get(options: GetDataSourceOptions): Promise { + const { kvStoreUrl, url } = this.parseProviderUrl(options.providerUrl); + return this.base.get({ + registry: options.registry, + url, + kvStoreUrl, + state: options.state, + signal: options.signal, + progressListener: options.progressListener, + }); } - findSourceGroup(url: string) { - const [dataSource, path, dataSourceName] = this.getProvider(url); - const helper = - dataSource.findSourceGroup || findSourceGroupBasedOnSeparator; - return helper(path) + dataSourceName.length + 3; + async completeUrl(options: CompleteUrlOptions): Promise { + const { kvStoreUrl, url, queryAndFragment } = this.parseProviderUrl( + options.providerUrl, + ); + if (queryAndFragment === "") { + return await getKvStoreCompletions( + options.registry.sharedKvStoreContext, + { + url: options.providerUrl, + signal: options.signal, + progressListener: options.progressListener, + singlePipelineComponent: true, + directoryOnly: this.base.expectsDirectory, + }, + ); + } + if (!this.base.completeUrl) return emptyCompletionResult; + return this.base.completeUrl({ + registry: options.registry, + signal: options.signal, + progressListener: options.progressListener, + kvStoreUrl, + url, + }); } } diff --git a/src/datasource/kvstore_completions.ts b/src/datasource/kvstore_completions.ts new file mode 100644 index 0000000000..3cf972ee3d --- /dev/null +++ b/src/datasource/kvstore_completions.ts @@ -0,0 +1,218 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { CompletionResult } from "#src/datasource/index.js"; +import type { AutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { KvStoreWithPath } from "#src/kvstore/index.js"; +import { listKvStore } from "#src/kvstore/index.js"; +import { + encodePathForUrl, + finalPipelineUrlComponent, + parsePipelineUrlComponent, +} from "#src/kvstore/url.js"; +import type { CompletionWithDescription } from "#src/util/completion.js"; +import { + concatCompletions, + applyCompletionOffset, +} from "#src/util/completion.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; + +export async function getKvStoreCompletions( + sharedKvStoreContext: SharedKvStoreContext, + options: { + url: string; + signal?: AbortSignal; + progressListener?: ProgressListener; + directoryOnly?: boolean; + autoDetectDirectory?: () => AutoDetectDirectorySpec; + singlePipelineComponent?: boolean; + }, +): Promise { + const { url, autoDetectDirectory } = options; + + const { kvStoreContext } = sharedKvStoreContext; + + const finalComponent = finalPipelineUrlComponent(url); + + let kvStore: KvStoreWithPath | undefined; + + let providerCompletionsPromise: + | Promise + | undefined; + + if (finalComponent !== url) { + const adapterUrl = parsePipelineUrlComponent(finalComponent); + const provider = kvStoreContext.getKvStoreAdapterProvider(adapterUrl); + const baseUrl = url.slice(0, url.length - finalComponent.length - 1); + const base = kvStoreContext.getKvStore(baseUrl); + if (provider.completeUrl !== undefined) { + providerCompletionsPromise = (async () => { + const result = await provider.completeUrl!({ + url: adapterUrl, + base, + signal: options.signal, + progressListener: options.progressListener, + }); + return applyCompletionOffset( + url.length - finalComponent.length + adapterUrl.scheme.length + 1, + result, + ); + })(); + } + try { + kvStore = provider.getKvStore(adapterUrl, base); + } catch (e) { + if (providerCompletionsPromise === undefined) { + throw e; + } + } + } else { + const parsedUrl = parsePipelineUrlComponent(finalComponent); + const provider = kvStoreContext.getBaseKvStoreProvider(parsedUrl); + if (provider.completeUrl !== undefined) { + providerCompletionsPromise = (async () => { + const result = await provider.completeUrl!({ + url: parsedUrl, + signal: options.signal, + progressListener: options.progressListener, + }); + return applyCompletionOffset(parsedUrl.scheme.length + 1, result); + })(); + } + try { + kvStore = provider.getKvStore(parsedUrl); + } catch (e) { + if (providerCompletionsPromise === undefined) { + throw e; + } + } + } + + let genericCompletionsPromise: Promise | undefined; + + if (kvStore === undefined) { + // Invalid URL, generic completions unavailable. + } else if (kvStore.store.getUrl(kvStore.path) !== url) { + // URL is valid but lacks final "/" terminator, skip completion. + // + // This avoids attempting to access e.g. `gs://bucke` as the user is typing + // `gs://bucket/`. + } else { + genericCompletionsPromise = (async () => { + const results = await listKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + responseKeys: "url", + }); + + // Infallible pattern + const [, directoryPath, namePrefix] = finalComponent.match( + /^((?:[a-zA-Z][a-zA-Z0-9-+.]*:)(?:.*\/)?)([^/]*)$/, + )!; + const offset = url.length - namePrefix.length; + const matches: CompletionWithDescription[] = []; + const directoryOffset = + url.length - finalComponent.length + directoryPath.length; + for (const entry of results.directories) { + matches.push({ value: entry.substring(directoryOffset) + "/" }); + } + if (!options.directoryOnly) { + const matchSuffix = options.singlePipelineComponent === true ? "" : "|"; + for (const entry of results.entries) { + matches.push({ + value: entry.key.substring(directoryOffset) + matchSuffix, + }); + } + } + + let defaultCompletion: string | undefined; + + if (autoDetectDirectory !== undefined && namePrefix === "") { + const names = new Set(); + const subDirectories = new Set(); + for (const entry of results.entries) { + names.add(entry.key.substring(directoryOffset)); + } + for (const subDirectory of results.directories) { + subDirectories.add(subDirectory.substring(directoryOffset)); + } + const pipelineMatches = await autoDetectDirectory().match({ + url, + fileNames: names, + subDirectories, + signal: options.signal, + }); + for (const match of pipelineMatches) { + matches.push({ + value: `|${match.suffix}`, + description: match.description, + }); + } + if (pipelineMatches.length === 1) { + defaultCompletion = `|${pipelineMatches[0].suffix}`; + } + } + return { offset, completions: matches, defaultCompletion }; + })(); + } + return await concatCompletions( + url, + await Promise.all([providerCompletionsPromise, genericCompletionsPromise]), + ); +} + +export async function getKvStorePathCompletions( + sharedKvStoreContext: SharedKvStoreContext, + options: { + baseUrl: string; + path: string; + signal?: AbortSignal; + progressListener?: ProgressListener; + directoryOnly?: boolean; + }, +): Promise { + const { baseUrl, path } = options; + const { store, path: basePath } = + sharedKvStoreContext.kvStoreContext.getKvStore(baseUrl); + if (!store.list) { + throw new Error("Listing not supported"); + } + + const fullPath = basePath + path; + + const fullOffset = Math.max(basePath.length, fullPath.lastIndexOf("/") + 1); + + const results = await store.list(fullPath, { + signal: options.signal, + progressListener: options.progressListener, + }); + + const matches: CompletionWithDescription[] = []; + for (const entry of results.directories) { + matches.push({ + value: encodePathForUrl(entry.substring(fullOffset) + "/"), + }); + } + if (!options.directoryOnly) { + for (const entry of results.entries) { + matches.push({ + value: encodePathForUrl(entry.key.substring(fullOffset)), + }); + } + } + return { offset: fullOffset - basePath.length, completions: matches }; +} diff --git a/src/datasource/local.ts b/src/datasource/local.ts new file mode 100644 index 0000000000..4df6dc0443 --- /dev/null +++ b/src/datasource/local.ts @@ -0,0 +1,132 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + emptyValidCoordinateSpace, + makeCoordinateSpace, + makeIdentityTransform, + type CoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import type { + CompleteUrlOptions, + DataSource, + GetDataSourceOptions, + DataSourceProvider, +} from "#src/datasource/index.js"; +import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; +import { createIdentity } from "#src/util/matrix.js"; + +export const localAnnotationsUrl = "local://annotations"; +export const localEquivalencesUrl = "local://equivalences"; + +export enum LocalDataSource { + annotations = 0, + equivalences = 1, +} + +export class LocalDataSourceProvider implements DataSourceProvider { + get scheme() { + return "local"; + } + get description() { + return "Local in-memory"; + } + + async get(options: GetDataSourceOptions): Promise { + switch (options.url) { + case localAnnotationsUrl: { + const { transform } = options; + let modelTransform: CoordinateSpaceTransform; + if (transform === undefined) { + const baseSpace = options.globalCoordinateSpace.value; + const { rank, names, scales, units } = baseSpace; + const inputSpace = makeCoordinateSpace({ + rank, + scales, + units, + names: names.map((_, i) => `${i}`), + }); + const outputSpace = makeCoordinateSpace({ + rank, + scales, + units, + names, + }); + modelTransform = { + rank, + sourceRank: rank, + inputSpace, + outputSpace, + transform: createIdentity(Float64Array, rank + 1), + }; + } else { + modelTransform = makeIdentityTransform(emptyValidCoordinateSpace); + } + return { + modelTransform, + canChangeModelSpaceRank: true, + subsources: [ + { + id: "default", + default: true, + subsource: { + local: LocalDataSource.annotations, + }, + }, + ], + }; + } + case localEquivalencesUrl: { + return { + modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), + canChangeModelSpaceRank: false, + subsources: [ + { + id: "default", + default: true, + subsource: { + local: LocalDataSource.equivalences, + }, + }, + ], + }; + } + } + throw new Error("Invalid local data source URL"); + } + + async completeUrl(options: CompleteUrlOptions) { + return { + offset: 0, + completions: getPrefixMatchesWithDescriptions( + options.providerUrl, + [ + { + value: "annotations", + description: "Annotations stored in the JSON state", + }, + { + value: "equivalences", + description: + "Segmentation equivalence graph stored in the JSON state", + }, + ], + (x) => x.value, + (x) => x.description, + ), + }; + } +} diff --git a/src/datasource/n5/backend.ts b/src/datasource/n5/backend.ts index ef3faee19c..6e1a7fcb9d 100644 --- a/src/datasource/n5/backend.ts +++ b/src/datasource/n5/backend.ts @@ -18,28 +18,21 @@ import { decodeBlosc } from "#src/async_computation/decode_blosc_request.js"; import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/n5/base.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import { decodeGzip } from "#src/util/gzip.js"; -import { - isNotFoundError, - responseArrayBuffer, -} from "#src/util/http_request.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; async function decodeChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, encoding: VolumeChunkEncoding, ) { @@ -61,13 +54,16 @@ async function decodeChunk( chunk.chunkDataSize = shape; let buffer = new Uint8Array(response, offset); switch (encoding) { + case VolumeChunkEncoding.ZLIB: + buffer = new Uint8Array(await decodeGzip(buffer, "deflate")); + break; case VolumeChunkEncoding.GZIP: - buffer = new Uint8Array(await decodeGzip(buffer)); + buffer = new Uint8Array(await decodeGzip(buffer, "gzip")); break; case VolumeChunkEncoding.BLOSC: buffer = await requestAsyncComputation( decodeBlosc, - cancellationToken, + signal, [buffer.buffer], buffer, ); @@ -75,7 +71,7 @@ async function decodeChunk( case VolumeChunkEncoding.ZSTD: buffer = await requestAsyncComputation( decodeZstd, - cancellationToken, + signal, [buffer.buffer], buffer, ); @@ -83,7 +79,7 @@ async function decodeChunk( } await decodeRawChunk( chunk, - cancellationToken, + signal, buffer.buffer, Endianness.BIG, buffer.byteOffset, @@ -93,35 +89,32 @@ async function decodeChunk( @registerSharedObject() export class PrecomputedVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { - const { parameters } = this; + private chunkKvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + async download(chunk: VolumeChunk, signal: AbortSignal) { + const { parameters, chunkKvStore } = this; const { chunkGridPosition } = chunk; - let url = parameters.url; + let path = chunkKvStore.path; const rank = this.spec.rank; for (let i = 0; i < rank; ++i) { - url += `/${chunkGridPosition[i]}`; - } - try { - const response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); - await decodeChunk( - chunk, - cancellationToken, - response, - parameters.encoding, - ); - } catch (e) { - if (!isNotFoundError(e)) throw e; + if (i !== 0) { + path += "/"; + } + path += `${chunkGridPosition[i]}`; } + const response = await chunkKvStore.store.read(path, { + signal, + }); + if (response === undefined) return; + await decodeChunk( + chunk, + signal, + await response.response.arrayBuffer(), + parameters.encoding, + ); } } diff --git a/src/datasource/n5/base.ts b/src/datasource/n5/base.ts index ef471c8c16..5dc6a2f444 100644 --- a/src/datasource/n5/base.ts +++ b/src/datasource/n5/base.ts @@ -15,10 +15,11 @@ */ export enum VolumeChunkEncoding { - RAW = 0, - GZIP = 1, - BLOSC = 2, - ZSTD = 3, + RAW, + ZLIB, + GZIP, + BLOSC, + ZSTD, } export class VolumeChunkSourceParameters { diff --git a/src/datasource/n5/frontend.ts b/src/datasource/n5/frontend.ts index ed4299a528..3c9f5856c4 100644 --- a/src/datasource/n5/frontend.ts +++ b/src/datasource/n5/frontend.ts @@ -21,10 +21,11 @@ * * https://github.com/saalfeldlab/n5-viewer * https://github.com/bigdataviewer/bigdataviewer-core/blob/master/BDV%20N5%20format.md + * + * https://github.com/janelia-cellmap/schemas/blob/master/multiscale.md */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { CoordinateArray, @@ -34,17 +35,28 @@ import { makeCoordinateSpace, makeIdentityTransform, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { getKvStorePathCompletions } from "#src/datasource/kvstore_completions.js"; import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/n5/base.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { CompletionResult, KvStoreContext } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + ensureNoQueryOrFragmentParameters, + ensurePathIsDirectory, + joinPath, + kvstoreEnsureDirectoryPipelineUrl, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -57,17 +69,11 @@ import { VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; -import type { Borrowed } from "#src/util/disposable.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { - isNotFoundError, - parseUrl, - responseJson, -} from "#src/util/http_request.js"; import { expectArray, parseArray, parseFixedLengthArray, + verifyBoolean, verifyEnumString, verifyFinitePositiveFloat, verifyObject, @@ -78,19 +84,12 @@ import { verifyStringArray, } from "#src/util/json.js"; import { createHomogeneousScaleMatrix } from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { scaleByExp10, unitFromJson } from "#src/util/si_units.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; class N5VolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} @@ -106,12 +105,11 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } constructor( - chunkManager: Borrowed, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public multiscaleMetadata: MultiscaleMetadata, public scales: (ScaleMetadata | undefined)[], ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); let dataType: DataType | undefined; let baseScaleIndex: number | undefined; scales.forEach((scale, i) => { @@ -131,7 +129,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou if (dataType === undefined) { throw new Error("At least one scale must be specified."); } - const baseDownsamplingInfo = multiscaleMetadata.scales[baseScaleIndex!]!; + const baseDownsamplingInfo = scales[baseScaleIndex!]!; const baseScale = scales[baseScaleIndex!]!; this.dataType = dataType; this.volumeType = VolumeType.IMAGE; @@ -146,7 +144,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou { transform: createHomogeneousScaleMatrix( Float64Array, - baseDownsamplingInfo.downsamplingFactor, + baseDownsamplingInfo.downsamplingFactors, /*square=*/ false, ), box: { @@ -161,14 +159,12 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou getSources(volumeSourceOptions: VolumeSourceOptions) { const { scales, rank } = this; - const scalesDownsamplingInfo = this.multiscaleMetadata.scales; return transposeNestedArrays( (scales.filter((scale) => scale !== undefined) as ScaleMetadata[]).map( - (scale, i) => { - const scaleDownsamplingInfo = scalesDownsamplingInfo[i]; + (scale) => { const transform = createHomogeneousScaleMatrix( Float32Array, - scaleDownsamplingInfo.downsamplingFactor, + scale.downsamplingFactors, ); return makeDefaultVolumeChunkSpecifications({ rank, @@ -183,10 +179,10 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou chunkSource: this.chunkManager.getChunkSource( N5VolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: scaleDownsamplingInfo.url, + url: scale.url, encoding: scale.encoding, }, }, @@ -204,134 +200,209 @@ interface MultiscaleMetadata { url: string; attributes: any; modelSpace: CoordinateSpace; - scales: { readonly url: string; readonly downsamplingFactor: Float64Array }[]; + scales: ( + | { + readonly url: string; + readonly downsamplingFactors?: Float64Array; + } + | undefined + )[]; } -class ScaleMetadata { +interface ScaleMetadata { + url: string; dataType: DataType; encoding: VolumeChunkEncoding; - size: Float32Array; - chunkSize: Uint32Array; + size: Float32Array; + chunkSize: Uint32Array; + downsamplingFactors: Float64Array; +} - constructor(obj: any) { - verifyObject(obj); - this.dataType = verifyObjectProperty(obj, "dataType", (x) => - verifyEnumString(x, DataType), - ); - this.size = Float32Array.from( - verifyObjectProperty(obj, "dimensions", (x) => - parseArray(x, verifyPositiveInt), - ), +function parseScaleMetadata( + url: string, + obj: any, + scaleIndex: number, + downsamplingFactors?: Float64Array, +): ScaleMetadata { + verifyObject(obj); + const dataType = verifyObjectProperty(obj, "dataType", (x) => + verifyEnumString(x, DataType), + ); + const size = Float32Array.from( + verifyObjectProperty(obj, "dimensions", (x) => + parseArray(x, verifyPositiveInt), + ), + ); + const chunkSize = verifyObjectProperty(obj, "blockSize", (x) => + parseFixedLengthArray(new Uint32Array(size.length), x, verifyPositiveInt), + ); + + let encoding: VolumeChunkEncoding | undefined; + verifyOptionalObjectProperty(obj, "compression", (compression) => { + encoding = verifyObjectProperty(compression, "type", (x) => + verifyEnumString(x, VolumeChunkEncoding), ); - this.chunkSize = verifyObjectProperty(obj, "blockSize", (x) => - parseFixedLengthArray( - new Uint32Array(this.size.length), - x, - verifyPositiveInt, - ), + if ( + encoding === VolumeChunkEncoding.GZIP && + verifyOptionalObjectProperty( + compression, + "useZlib", + verifyBoolean, + false, + ) === true + ) { + encoding = VolumeChunkEncoding.ZLIB; + } + }); + if (encoding === undefined) { + encoding = verifyObjectProperty(obj, "compressionType", (x) => + verifyEnumString(x, VolumeChunkEncoding), ); + } - let encoding: VolumeChunkEncoding | undefined; - verifyOptionalObjectProperty(obj, "compression", (compression) => { - encoding = verifyObjectProperty(compression, "type", (x) => - verifyEnumString(x, VolumeChunkEncoding), - ); - }); - if (encoding === undefined) { - encoding = verifyObjectProperty(obj, "compressionType", (x) => - verifyEnumString(x, VolumeChunkEncoding), - ); + if (downsamplingFactors === undefined) { + downsamplingFactors = verifyOptionalObjectProperty( + obj, + "downsamplingFactors", + (x) => + parseFixedLengthArray( + new Float64Array(size.length), + x, + verifyFinitePositiveFloat, + ), + ); + if (downsamplingFactors === undefined) { + if (scaleIndex === 0) { + downsamplingFactors = new Float64Array(size.length); + downsamplingFactors.fill(1); + } else { + throw new Error("Expected downsamplingFactors attribute"); + } } - this.encoding = encoding; } + + return { url, dataType, encoding, size, chunkSize, downsamplingFactors }; } function getAllScales( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, multiscaleMetadata: MultiscaleMetadata, + options: Partial, ): Promise<(ScaleMetadata | undefined)[]> { return Promise.all( - multiscaleMetadata.scales.map(async (scale) => { - const attributes = await getAttributes( - chunkManager, - credentialsProvider, + multiscaleMetadata.scales.map(async (scale, scaleIndex) => { + if (scale === undefined) return undefined; + const { attributes } = (await getAttributes( + sharedKvStoreContext, scale.url, true, - ); + options, + ))!; if (attributes === undefined) return undefined; - return new ScaleMetadata(attributes); + try { + return parseScaleMetadata( + scale.url, + attributes, + scaleIndex, + scale.downsamplingFactors, + ); + } catch (e) { + throw new Error(`Error parsing array metadata at ${scale.url}`, { + cause: e, + }); + } }), ); } -function getAttributesJsonUrls(url: string): string[] { - let { protocol, host, path } = parseUrl(url); - if (path.endsWith("/")) { - path = path.substring(0, path.length - 1); - } - const urls: string[] = []; +function getAttributesJsonUrls( + kvStoreContext: KvStoreContext, + url: string, +): { attributesJsonUrl: string; directoryUrl: string; relativePath: string }[] { + const kvStore = kvStoreContext.getKvStore(url); + const urls: { + attributesJsonUrl: string; + directoryUrl: string; + relativePath: string; + }[] = []; + let path = kvStore.path.substring(0, kvStore.path.length - 1); while (true) { - urls.push(`${protocol}://${host}${path}/attributes.json`); + const directoryPath = ensurePathIsDirectory(path); + urls.push({ + attributesJsonUrl: kvStore.store.getUrl( + joinPath(path, "attributes.json"), + ), + directoryUrl: kvStore.store.getUrl(directoryPath), + relativePath: kvStore.path.substring(directoryPath.length), + }); + if (path === "") break; const index = path.lastIndexOf("/"); - if (index === -1) break; path = path.substring(0, index); } return urls; } function getIndividualAttributesJson( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "n5:attributes.json", url, - credentialsProvider: getObjectId(credentialsProvider), }, - () => - cancellableFetchSpecialOk(credentialsProvider, url, {}, responseJson) - .then((j) => { - try { - return verifyObject(j); - } catch (e) { - throw new Error( - `Error reading attributes from ${url}: ${e.message}`, - ); - } - }) - .catch((e) => { - if (isNotFoundError(e)) { - if (required) return undefined; - return {}; - } - throw e; - }), + options, + async (progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading n5 metadata from ${url}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(url, { + ...progressOptions, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + const json = await response.response.json(); + try { + return verifyObject(json); + } catch (e) { + throw new Error(`Error reading attributes from ${url}`, { cause: e }); + } + }, ); } async function getAttributes( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, required: boolean, -): Promise { - const attributesJsonUrls = getAttributesJsonUrls(url); + options: Partial, +): Promise< + { attributes: unknown; rootUrl: string; pathFromRoot: string } | undefined +> { + const attributesJsonUrls = getAttributesJsonUrls( + sharedKvStoreContext.kvStoreContext, + url, + ); const metadata = await Promise.all( attributesJsonUrls.map((u, i) => getIndividualAttributesJson( - chunkManager, - credentialsProvider, - u, + sharedKvStoreContext, + u.attributesJsonUrl, required && i === attributesJsonUrls.length - 1, + options, ), ), ); - if (metadata.indexOf(undefined) !== -1) return undefined; + const rootIndex = metadata.findLastIndex((x) => x !== undefined); + if (rootIndex === -1) return undefined; metadata.reverse(); - return Object.assign({}, ...metadata); + const rootInfo = attributesJsonUrls[rootIndex]; + return { + attributes: Object.assign({}, ...metadata.filter((x) => x !== undefined)), + rootUrl: rootInfo.directoryUrl, + pathFromRoot: rootInfo.relativePath, + }; } function verifyRank(existing: number, n: number) { @@ -377,10 +448,12 @@ function getDefaultAxes(rank: number) { return axes; } -function getMultiscaleMetadata( +async function getMultiscaleMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, attributes: any, -): MultiscaleMetadata { + progressOptions: ProgressOptions, +): Promise { verifyObject(attributes); let rank = -1; @@ -400,8 +473,8 @@ function getMultiscaleMetadata( return units; }); let defaultUnit = { unit: "m", exponent: -9 }; - let singleDownsamplingFactors: Float64Array | undefined; - let allDownsamplingFactors: Float64Array[] | undefined; + let singleDownsamplingFactors: Float64Array | undefined; + let allDownsamplingFactors: Float64Array[] | undefined; verifyOptionalObjectProperty(attributes, "downsamplingFactors", (dObj) => { const { single, all, rank: curRank } = parseDownsamplingFactors(dObj); rank = verifyRank(rank, curRank); @@ -490,17 +563,33 @@ function getMultiscaleMetadata( }); if (dimensions === undefined) { if (allDownsamplingFactors === undefined) { - throw new Error( - "Not valid single-resolution or multi-resolution dataset", + const scaleDirectories = await findScaleDirectories( + sharedKvStoreContext, + url, + progressOptions, ); + if (scaleDirectories.length === 0) { + throw new Error( + "Not valid single-resolution or multi-resolution dataset", + ); + } + return { + modelSpace, + url, + attributes, + scales: scaleDirectories.map((name) => ({ + url: `${url}${name}/`, + downsamplingFactors: undefined, + })), + }; } return { modelSpace, url, attributes, scales: allDownsamplingFactors.map((f, i) => ({ - url: `${url}/s${i}`, - downsamplingFactor: f, + url: `${url}s${i}/`, + downsamplingFactors: f, })), }; } @@ -512,45 +601,80 @@ function getMultiscaleMetadata( modelSpace, url, attributes, - scales: [{ url, downsamplingFactor: singleDownsamplingFactors }], + scales: [{ url, downsamplingFactors: singleDownsamplingFactors }], }; } -export class N5DataSource extends DataSourceProvider { +async function findScaleDirectories( + sharedKvStoreContext: SharedKvStoreContext, + url: string, + progressOptions: ProgressOptions, +): Promise { + const result = await sharedKvStoreContext.kvStoreContext.list(url, { + responseKeys: "suffix", + ...progressOptions, + }); + const scaleDirectories: string[] = []; + for (const directory of result.directories) { + if (directory.match(/^s(?:0|[1-9][0-9]*)$/)) { + const scale = Number(directory.substring(1)); + scaleDirectories[scale] = directory; + } + } + return scaleDirectories; +} + +export class N5DataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "n5"; + } + get expectsDirectory() { + return true; + } get description() { return "N5 data source"; } - get(options: GetDataSourceOptions): Promise { - let { providerUrl } = options; - if (providerUrl.endsWith("/")) { - providerUrl = providerUrl.substring(0, providerUrl.length - 1); - } - return options.chunkManager.memoize.getUncounted( - { type: "n5:MultiscaleVolumeChunkSource", providerUrl }, - async () => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); - const attributes = await getAttributes( - options.chunkManager, - credentialsProvider, + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureNoQueryOrFragmentParameters(options.url); + const url = kvstoreEnsureDirectoryPipelineUrl( + pipelineUrlJoin( + kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + options.url.suffix ?? "", + ), + ); + const { sharedKvStoreContext } = options.registry; + return options.registry.chunkManager.memoize.getAsync( + { type: "n5:MultiscaleVolumeChunkSource", url }, + options, + async (progressOptions) => { + const attributeResult = await getAttributes( + sharedKvStoreContext, url, false, + progressOptions, + ); + if (attributeResult === undefined) { + throw new Error("N5 metadata not found"); + } + const { attributes, rootUrl, pathFromRoot } = attributeResult; + const multiscaleMetadata = await getMultiscaleMetadata( + sharedKvStoreContext, + url, + attributes, + progressOptions, ); - const multiscaleMetadata = getMultiscaleMetadata(url, attributes); const scales = await getAllScales( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleMetadata, + progressOptions, ); const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleMetadata, scales, ); return { + canonicalUrl: `${rootUrl}|${options.url.scheme}:${pathFromRoot}`, modelTransform: makeIdentityTransform(volume.modelSpace), subsources: [ { @@ -575,11 +699,25 @@ export class N5DataSource extends DataSourceProvider { ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, - ); + async completeUrl( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + ensureNoQueryOrFragmentParameters(options.url); + return getKvStorePathCompletions(options.registry.sharedKvStoreContext, { + baseUrl: kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + path: options.url.suffix ?? "", + directoryOnly: true, + signal: options.signal, + progressListener: options.progressListener, + }); } } + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["attributes.json"]), { + suffix: "n5:", + description: "N5", + }), + ); +} diff --git a/src/datasource/n5/index.rst b/src/datasource/n5/index.rst new file mode 100644 index 0000000000..08eb35990b --- /dev/null +++ b/src/datasource/n5/index.rst @@ -0,0 +1,171 @@ +.. _n5-datasource: + +n5 +== + +The N5 :ref:`data format driver` provides access to N5 +single-resolution and multi-resolution arrays. + +URL syntax +---------- + +- :file:`{base-kvstore-url/}|n5:` +- :file:`{base-kvstore-url/}|n5:{additional/path/}` + +Specifying an :file:`{additional/path/}` after the n5 URL scheme is currently +equivalent to including it in the :file:`{base-kvstore-url/}`, but may be +preferred for distinguishing the root of an N5 hierarchy from the path within +it. + +Multiscale datasets +------------------- + +Multiscale datasets are specified by directory tree containing the following +files and directories: + +- :file:`attributes.json` (multiscale metadata, also inherits attributes from + ancestor directories) +- :file:`s0/` (base resolution) +- :file:`s1/` (first downsampling level) +- :file:`s{N}/` (:file:`N`\ th downsampling level) + +The downsampling factors for each level may be specified in several ways: + +- Each :file:`s{N}/attribute.json` file may specify a ``downsamplingFactors`` + attribute as an array specifying the downsampling factor corresponding to each + dimension of the array. For example :file:`s1/attributes.json` may specify: + + .. code-block:: json + + { + "dataType": "uint8", + "dimensions": [1000, 1000, 1000], + "blockSize": [100, 100, 100], + "compression": {"type": "raw"}, + "downsamplingFactors": [2, 2, 1] + } + + to indicate that the first two dimensions are downsampled by 2 and the last + dimension is not downsampled. If the base resolution :file:`s0/` array does + not specify a ``downsamplingFactors`` attribute, the downsampling factor is + assume to be 1 for all dimensions. + + .. note:: + + In this case, the set of downsampling levels is determined by a list + operation on the base key-value store, and fails if listing is not + supported. + +- The top-level :file:`attributes.json` may specify a ``downsamplingFactors`` or + ``scales`` attribute as an array of arrays, where the outer array ranges over + downsampling levels, starting from 0, and the inner array ranges over + dimensions. For example: + + .. code-block:: json + + { + "downsamplingFactors": [ + [1, 1, 1], + [2, 2, 1], + [4, 4, 1] + ] + } + + indicates that there are 3 downsampling levels, where: + + - :file:`s0/` has downsampling factors of :json:`[1, 1, 1]`, + - :file:`s1/` has downsampling factors of :json:`[2, 2, 1]`, and + - :file:`s2/` has downsampling factors of :json:`[4, 4, 1]`. + + .. note:: + + When the downsampling factors are specified in the top-level metadata in + this way, any ``downsamplingFactors`` attributes specified in the + individual :file:`s{N}/attributes.json` metadata files are ignored, and the + base key-value store need not support listing. + + The behavior is identical if the attribute is specified as ``scales`` instead + of ``downsamplingFactors``. + +Data types +---------- + +Supported data types: + +- uint8 +- int8 +- uint16 +- int16 +- uint32 +- int32 +- uint64 +- float32 + +Codecs +------ + +Supported compression types: + +- raw +- blosc +- gzip + +Coordinate space metadata +------------------------- + +Dimension names +~~~~~~~~~~~~~~~ + +Dimension names may be specified using the ``axes`` metadata attribute; if +present, the ``axes`` attribute must be an array of strings, specifying the name +of each dimension in the same order as the ``dimensions`` attribute. + +Physical units +~~~~~~~~~~~~~~ + +Units may be specified using the ``resolution`` and ``units`` attributes, which +specify the coefficient and unit of each dimension in the same order as the +``dimensions`` attribute. For example, for a 3-d array: + +.. code-block:: json + + { + "resolution": [4, 4, 30], + "units": ["nm", "nm", "nm"] + } + +Alternatively, units may be specified using the ``pixelResolution`` attribute: + +.. code-block:: json + + { + "pixelResolution": { + "unit": "nm", + "dimensions": [4, 4, 30] + } + } + +The ``pixelResolution`` attribute is not recommended, however, since it is less +widely supported and requires all dimensions to have the same base unit. + +Coordinate arrays +~~~~~~~~~~~~~~~~~ + +As a Neuroglancer-specific extension, coordinate arrays may be specified using +the ``coordinateArrays`` metadata attribute; if present, the +``coordinateArrays`` attribute must be an object, where the keys correspond to +dimension names in ``axes`` and the values are arrays of strings specifying the +coordinate labels starting at 0. For example: + +.. code-block:: json + + { + "dimensions": [10000, 10000, 5], + "dataType": "uint8", + "blockSize": [512, 512, 1], + "compression": { "type": "raw" }, + "axes": ["x", "y", "c"], + "coordinateArrays": { + "c": ["A", "B", "C", "D", "E"] + } + } diff --git a/src/datasource/n5/register_default.ts b/src/datasource/n5/register_default.ts index dddddbb211..7732860e74 100644 --- a/src/datasource/n5/register_default.ts +++ b/src/datasource/n5/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { N5DataSource } from "#src/datasource/n5/frontend.js"; +import { + registerKvStoreBasedDataProvider, + dataSourceAutoDetectRegistry, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + N5DataSource, + registerAutoDetect, +} from "#src/datasource/n5/frontend.js"; -registerProvider("n5", () => new N5DataSource()); +const provider = new N5DataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/ngauth/credentials_provider.ts b/src/datasource/ngauth/credentials_provider.ts deleted file mode 100644 index 2d3affd68c..0000000000 --- a/src/datasource/ngauth/credentials_provider.ts +++ /dev/null @@ -1,151 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; -import { - CredentialsProvider, - makeCredentialsGetter, -} from "#src/credentials_provider/index.js"; -import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import { StatusMessage } from "#src/status.js"; -import { HttpError, responseJson } from "#src/util/http_request.js"; -import { - verifyObject, - verifyObjectProperty, - verifyString, -} from "#src/util/json.js"; - -function makeOriginError(serverUrl: string): Error { - return new Error( - `ngauth server ${serverUrl} ` + - `does not allow requests from Neuroglancer instance ${self.origin}`, - ); -} - -export interface Credentials { - token: string; -} - -async function waitForLogin(serverUrl: string): Promise { - const status = new StatusMessage(/*delay=*/ false); - function writeLoginStatus(message: string, buttonMessage: string) { - status.element.textContent = message + " "; - const button = document.createElement("button"); - button.textContent = buttonMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - window.open( - `${serverUrl}/login?origin=${encodeURIComponent(self.origin)}`, - ); - writeLoginStatus( - `Waiting for login to ngauth server ${serverUrl}...`, - "Retry", - ); - }); - } - const messagePromise = new Promise((resolve, reject) => { - function messageHandler(event: MessageEvent) { - const eventOrigin = - event.origin || ((event).originalEvent).origin; - if (eventOrigin !== serverUrl) { - return; - } - const removeListener = () => { - window.removeEventListener("message", messageHandler, false); - }; - const { data } = event; - if (event.data === "badorigin") { - removeListener(); - reject(makeOriginError(serverUrl)); - } - try { - verifyObject(data); - const token = verifyObjectProperty(data, "token", verifyString); - removeListener(); - resolve(token); - } catch (e) { - console.log( - "ngauth: Received unexpected message from ${serverUrl}", - event, - ); - } - } - window.addEventListener("message", messageHandler, false); - }); - writeLoginStatus(`ngauth server ${serverUrl} login required.`, "Login"); - try { - return { token: await messagePromise }; - } finally { - status.dispose(); - } -} - -export class NgauthCredentialsProvider extends CredentialsProvider { - constructor(public serverUrl: string) { - super(); - } - get = makeCredentialsGetter(async () => { - const response = await fetch(`${this.serverUrl}/token`, { - method: "POST", - credentials: "include", - }); - switch (response.status) { - case 200: - return { token: await response.text() }; - case 401: - return await waitForLogin(this.serverUrl); - case 403: - throw makeOriginError(this.serverUrl); - default: - throw HttpError.fromResponse(response); - } - }); -} - -export class NgauthGcsCredentialsProvider extends CredentialsProvider { - constructor( - public ngauthCredentialsProvider: CredentialsProvider, - public serverUrl: string, - public bucket: string, - ) { - super(); - } - get = makeCredentialsGetter(async () => { - const response = await fetchWithCredentials( - this.ngauthCredentialsProvider, - `${this.serverUrl}/gcs_token`, - { method: "POST" }, - responseJson, - (credentials, init) => { - return { - ...init, - body: JSON.stringify({ - token: credentials.token, - bucket: this.bucket, - }), - }; - }, - (error) => { - const { status } = error; - if (status === 401) { - return "refresh"; - } - throw error; - }, - ); - return { tokenType: "Bearer", accessToken: response.token }; - }); -} diff --git a/src/datasource/nggraph/frontend.ts b/src/datasource/nggraph/frontend.ts index 056baf4bc4..8578c9cf6d 100644 --- a/src/datasource/nggraph/frontend.ts +++ b/src/datasource/nggraph/frontend.ts @@ -16,7 +16,7 @@ import { debounce } from "lodash-es"; import type { ChunkManager } from "#src/chunk_manager/frontend.js"; -import { fetchWithCredentials } from "#src/credentials_provider/http_request.js"; +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; import { CredentialsProvider, makeCredentialsGetter, @@ -27,8 +27,8 @@ import type { DataSource, DataSubsourceEntry, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import type { Credentials } from "#src/datasource/nggraph/credentials_provider.js"; import { NggraphCredentialsProvider } from "#src/datasource/nggraph/credentials_provider.js"; import type { SegmentationUserLayer } from "#src/layer/segmentation/index.js"; @@ -45,11 +45,9 @@ import { } from "#src/segmentation_graph/source.js"; import { StatusMessage } from "#src/status.js"; import type { Uint64Set } from "#src/uint64_set.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; import { DisjointUint64Sets } from "#src/util/disjoint_sets.js"; -import { responseJson } from "#src/util/http_request.js"; +import type { RequestInitWithProgress } from "#src/util/http_request.js"; import { parseArray, verifyFiniteFloat, @@ -117,7 +115,7 @@ type GraphSegmentUpdate = GraphSegmentInfo | "invalid" | "error"; let updateGeneration = 0; class GraphConnection extends SegmentationGraphSourceConnection { - graph: NggraphSegmentationGraphSource; + declare graph: NggraphSegmentationGraphSource; constructor( graph: NggraphSegmentationGraphSource, segmentsState: VisibleSegmentsState, @@ -611,13 +609,11 @@ function fetchWithNggraphCredentials( serverUrl: string, path: string, init: RequestInit, - cancellationToken: CancellationToken = uncancelableToken, ): Promise { - return fetchWithCredentials( + return fetchOkWithCredentials( credentialsProvider, `${serverUrl}${path}`, init, - responseJson, (credentials, init) => { const headers = new Headers(init.headers); headers.set("Authorization", credentials.token); @@ -628,8 +624,7 @@ function fetchWithNggraphCredentials( if (status === 401) return "refresh"; throw error; }, - cancellationToken, - ); + ).then((response) => response.json()); } interface EntityCredentials extends Credentials { @@ -642,14 +637,12 @@ function nggraphServerFetch( serverUrl: string, path: string, init: RequestInit, - cancellationToken: CancellationToken = uncancelableToken, ): Promise { return fetchWithNggraphCredentials( getCredentialsProvider(chunkManager, serverUrl), serverUrl, path, init, - cancellationToken, ); } @@ -709,15 +702,13 @@ function nggraphGraphFetch( serverUrl: string, entityName: string, path: string, - init: RequestInit, - cancellationToken: CancellationToken = uncancelableToken, + init: RequestInitWithProgress, ): Promise { return fetchWithNggraphCredentials( getEntityCredentialsProvider(chunkManager, serverUrl, entityName), serverUrl, path, init, - cancellationToken, ); } @@ -742,41 +733,46 @@ function parseListResponse(response: any) { ); } -export class NggraphDataSource extends DataSourceProvider { +export class NggraphDataSource implements DataSourceProvider { + get scheme() { + return "nggraph"; + } get description() { return "nggraph data source"; } get(options: GetDataSourceOptions): Promise { const { serverUrl, id } = parseNggraphUrl(options.providerUrl); - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "nggraph:get", serverUrl, id }, - async (): Promise => { + options, + async (progressOptions): Promise => { const entityCredentialsProvider = getEntityCredentialsProvider( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, ); - const { entityType } = (await entityCredentialsProvider.get()) - .credentials; + const { entityType } = ( + await entityCredentialsProvider.get(undefined, progressOptions) + ).credentials; if (entityType !== "graph") { throw new Error( `Unsupported entity type: ${JSON.stringify(entityType)}`, ); } const { datasource_url: baseSegmentation } = await nggraphGraphFetch( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, "/graph/config", - { method: "POST" }, + { method: "POST", ...progressOptions }, ); const baseSegmentationDataSource = await options.registry.get({ ...options, url: baseSegmentation, }); const segmentationGraph = new NggraphSegmentationGraphSource( - options.chunkManager, + options.registry.chunkManager, serverUrl, id, ); @@ -799,13 +795,20 @@ export class NggraphDataSource extends DataSourceProvider { async completeUrl(options: CompleteUrlOptions): Promise { const { serverUrl, id } = parseNggraphUrl(options.providerUrl); - const list = await options.chunkManager.memoize.getUncounted( + const list = await options.registry.chunkManager.memoize.getAsync( { type: "nggraph:list", serverUrl }, - async () => { + options, + async (progressOptions) => { return parseListResponse( - await nggraphServerFetch(options.chunkManager, serverUrl, "/list", { - method: "POST", - }), + await nggraphServerFetch( + options.registry.chunkManager, + serverUrl, + "/list", + { + method: "POST", + ...progressOptions, + }, + ), ); }, ); diff --git a/src/datasource/nggraph/register_default.ts b/src/datasource/nggraph/register_default.ts index 82c0754698..99e3c0dede 100644 --- a/src/datasource/nggraph/register_default.ts +++ b/src/datasource/nggraph/register_default.ts @@ -17,4 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { NggraphDataSource } from "#src/datasource/nggraph/frontend.js"; -registerProvider("nggraph", () => new NggraphDataSource()); +registerProvider(new NggraphDataSource()); diff --git a/src/datasource/nifti/backend.ts b/src/datasource/nifti/backend.ts index 0b8192e8a4..5e1aba204b 100644 --- a/src/datasource/nifti/backend.ts +++ b/src/datasource/nifti/backend.ts @@ -16,24 +16,20 @@ import type { NIFTI2 } from "nifti-reader-js"; import { isCompressed, NIFTI1, readHeader, readImage } from "nifti-reader-js"; -import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; -import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; -import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, VolumeSourceParameters, } from "#src/datasource/nifti/base.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; import { DataType } from "#src/sliceview/volume/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { Endianness } from "#src/util/endian.js"; import { kOneVec, @@ -44,10 +40,7 @@ import { } from "#src/util/geom.js"; import { decodeGzip } from "#src/util/gzip.js"; import * as matrix from "#src/util/matrix.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import type { RPCPromise } from "#src/worker_rpc.js"; import { registerPromiseRPC, registerSharedObject } from "#src/worker_rpc.js"; @@ -57,11 +50,12 @@ export class NiftiFileData { } async function decodeNiftiFile( - buffer: ArrayBuffer, - _cancellationToken: CancellationToken, + readResponse: ReadResponse, + options: ProgressOptions, ) { + let buffer = await readResponse.response.arrayBuffer(); if (isCompressed(buffer)) { - buffer = await decodeGzip(buffer); + buffer = await decodeGzip(buffer, "gzip", options.signal); } const data = new NiftiFileData(); data.uncompressedData = buffer; @@ -74,40 +68,24 @@ async function decodeNiftiFile( } function getNiftiFileData( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContextCounterpart: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, + options: Partial, ) { - return GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - decodeNiftiFile, + return getCachedDecodedUrl( + sharedKvStoreContextCounterpart, url, - getPriority, - cancellationToken, + decodeNiftiFile, + options, ); } -const NIFTI_HEADER_INFO_PRIORITY = 1000; - async function getNiftiHeaderInfo( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - cancellationToken: CancellationToken, + options: Partial, ) { - const data = await getNiftiFileData( - chunkManager, - credentialsProvider, - url, - () => ({ - priorityTier: ChunkPriorityTier.VISIBLE, - priority: NIFTI_HEADER_INFO_PRIORITY, - }), - cancellationToken, - ); + const data = await getNiftiFileData(sharedKvStoreContext, url, options); return data.header; } @@ -166,174 +144,161 @@ const DATA_TYPE_CONVERSIONS = new Map([ registerPromiseRPC( GET_NIFTI_VOLUME_INFO_RPC_ID, - async function (x, cancellationToken): RPCPromise { - const chunkManager = this.getRef(x.chunkManager); - const credentialsProvider = this.getOptionalRef< - SharedCredentialsProviderCounterpart< - Exclude - > - >(x.credentialsProvider); - try { - const header = await getNiftiHeaderInfo( - chunkManager, - credentialsProvider, - x.url, - cancellationToken, + async function (x, progressOptions): RPCPromise { + const sharedKvStoreContext = this.get( + x.sharedKvStoreContext, + ) as SharedKvStoreContextCounterpart; + const header = await getNiftiHeaderInfo( + sharedKvStoreContext, + x.url, + progressOptions, + ); + const dataTypeInfo = DATA_TYPE_CONVERSIONS.get(header.datatypeCode); + if (dataTypeInfo === undefined) { + throw new Error( + "Unsupported data type: " + + `${NiftiDataType[header.datatypeCode] || header.datatypeCode}.`, ); - const dataTypeInfo = DATA_TYPE_CONVERSIONS.get(header.datatypeCode); - if (dataTypeInfo === undefined) { - throw new Error( - "Unsupported data type: " + - `${NiftiDataType[header.datatypeCode] || header.datatypeCode}.`, - ); - } - let spatialInvScale = 1; - let spatialUnit = ""; - switch (header.xyzt_units & NIFTI1.SPATIAL_UNITS_MASK) { - case NIFTI1.UNITS_METER: - spatialInvScale = 1; - spatialUnit = "m"; - break; - case NIFTI1.UNITS_MM: - spatialInvScale = 1e3; - spatialUnit = "m"; - break; - case NIFTI1.UNITS_MICRON: - spatialInvScale = 1e6; - spatialUnit = "m"; - break; - } + } + let spatialInvScale = 1; + let spatialUnit = ""; + switch (header.xyzt_units & NIFTI1.SPATIAL_UNITS_MASK) { + case NIFTI1.UNITS_METER: + spatialInvScale = 1; + spatialUnit = "m"; + break; + case NIFTI1.UNITS_MM: + spatialInvScale = 1e3; + spatialUnit = "m"; + break; + case NIFTI1.UNITS_MICRON: + spatialInvScale = 1e6; + spatialUnit = "m"; + break; + } - let timeUnit = ""; - let timeInvScale = 1; - switch (header.xyzt_units & NIFTI1.TEMPORAL_UNITS_MASK) { - case NIFTI1.UNITS_SEC: - timeUnit = "s"; - timeInvScale = 1; - break; - case NIFTI1.UNITS_MSEC: - timeUnit = "s"; - timeInvScale = 1e3; - break; - case NIFTI1.UNITS_USEC: - timeUnit = "s"; - timeInvScale = 1e6; - break; - case NIFTI1.UNITS_HZ: - timeUnit = "Hz"; - timeInvScale = 1; - break; - case NIFTI1.UNITS_RADS: - timeUnit = "rad/s"; - timeInvScale = 1; - break; - } - let units: string[] = [ - spatialUnit, - spatialUnit, - spatialUnit, - timeUnit, - "", - "", - "", - ]; - let sourceScales = Float64Array.of( - header.pixDims[1] / spatialInvScale, - header.pixDims[2] / spatialInvScale, - header.pixDims[3] / spatialInvScale, - header.pixDims[4] / timeInvScale, - header.pixDims[5], - header.pixDims[6], - header.pixDims[7], - ); - let viewScales = Float64Array.of( - 1 / spatialInvScale, - 1 / spatialInvScale, - 1 / spatialInvScale, - 1 / timeInvScale, - 1, - 1, - 1, - ); - let sourceNames = ["i", "j", "k", "m", "c^", "c1^", "c2^"]; - let viewNames = ["x", "y", "z", "t", "c^", "c1^", "c2^"]; - const rank = header.dims[0]; - sourceNames = sourceNames.slice(0, rank); - viewNames = viewNames.slice(0, rank); - units = units.slice(0, rank); - sourceScales = sourceScales.slice(0, rank); - viewScales = viewScales.slice(0, rank); - const { quatern_b, quatern_c, quatern_d } = header; - const quatern_a = Math.sqrt( - 1.0 - - quatern_b * quatern_b - - quatern_c * quatern_c - - quatern_d * quatern_d, - ); - const qfac = header.pixDims[0] === -1 ? -1 : 1; - const qoffset = vec3.fromValues( - header.qoffset_x, - header.qoffset_y, - header.qoffset_z, - ); - // https://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields/nifti1fields_pages/qsform.html - const method3Transform = convertAffine(header.affine); - method3Transform; - const method2Transform = translationRotationScaleZReflectionToMat4( - mat4.create(), - qoffset, - quat.fromValues(quatern_b, quatern_c, quatern_d, quatern_a), - kOneVec, - qfac, - ); - const transform = matrix.createIdentity(Float64Array, rank + 1); - const copyRank = Math.min(3, rank); - for (let row = 0; row < copyRank; ++row) { - for (let col = 0; col < copyRank; ++col) { - transform[col * (rank + 1) + row] = method2Transform[col * 4 + row]; - } - transform[rank * (rank + 1) + row] = method2Transform[12 + row]; + let timeUnit = ""; + let timeInvScale = 1; + switch (header.xyzt_units & NIFTI1.TEMPORAL_UNITS_MASK) { + case NIFTI1.UNITS_SEC: + timeUnit = "s"; + timeInvScale = 1; + break; + case NIFTI1.UNITS_MSEC: + timeUnit = "s"; + timeInvScale = 1e3; + break; + case NIFTI1.UNITS_USEC: + timeUnit = "s"; + timeInvScale = 1e6; + break; + case NIFTI1.UNITS_HZ: + timeUnit = "Hz"; + timeInvScale = 1; + break; + case NIFTI1.UNITS_RADS: + timeUnit = "rad/s"; + timeInvScale = 1; + break; + } + let units: string[] = [ + spatialUnit, + spatialUnit, + spatialUnit, + timeUnit, + "", + "", + "", + ]; + let sourceScales = Float64Array.of( + header.pixDims[1] / spatialInvScale, + header.pixDims[2] / spatialInvScale, + header.pixDims[3] / spatialInvScale, + header.pixDims[4] / timeInvScale, + header.pixDims[5], + header.pixDims[6], + header.pixDims[7], + ); + let viewScales = Float64Array.of( + 1 / spatialInvScale, + 1 / spatialInvScale, + 1 / spatialInvScale, + 1 / timeInvScale, + 1, + 1, + 1, + ); + let sourceNames = ["i", "j", "k", "m", "c^", "c1^", "c2^"]; + let viewNames = ["x", "y", "z", "t", "c^", "c1^", "c2^"]; + const rank = header.dims[0]; + sourceNames = sourceNames.slice(0, rank); + viewNames = viewNames.slice(0, rank); + units = units.slice(0, rank); + sourceScales = sourceScales.slice(0, rank); + viewScales = viewScales.slice(0, rank); + const { quatern_b, quatern_c, quatern_d } = header; + const quatern_a = Math.sqrt( + 1.0 - + quatern_b * quatern_b - + quatern_c * quatern_c - + quatern_d * quatern_d, + ); + const qfac = header.pixDims[0] === -1 ? -1 : 1; + const qoffset = vec3.fromValues( + header.qoffset_x, + header.qoffset_y, + header.qoffset_z, + ); + // https://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields/nifti1fields_pages/qsform.html + const method3Transform = convertAffine(header.affine); + method3Transform; + const method2Transform = translationRotationScaleZReflectionToMat4( + mat4.create(), + qoffset, + quat.fromValues(quatern_b, quatern_c, quatern_d, quatern_a), + kOneVec, + qfac, + ); + const transform = matrix.createIdentity(Float64Array, rank + 1); + const copyRank = Math.min(3, rank); + for (let row = 0; row < copyRank; ++row) { + for (let col = 0; col < copyRank; ++col) { + transform[col * (rank + 1) + row] = method2Transform[col * 4 + row]; } - const info: NiftiVolumeInfo = { - rank, - sourceNames, - viewNames, - units, - sourceScales, - viewScales, - description: header.description, - transform, - dataType: dataTypeInfo.dataType, - volumeSize: Uint32Array.from(header.dims.slice(1, 1 + rank)), - }; - return { value: info }; - } finally { - chunkManager.dispose(); - credentialsProvider?.dispose(); + transform[rank * (rank + 1) + row] = method2Transform[12 + row]; } + const info: NiftiVolumeInfo = { + rank, + sourceNames, + viewNames, + units, + sourceScales, + viewScales, + description: header.description, + transform, + dataType: dataTypeInfo.dataType, + volumeSize: Uint32Array.from(header.dims.slice(1, 1 + rank)), + }; + return { value: info }; }, ); @registerSharedObject() export class NiftiVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeSourceParameters, ) { - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const data = await getNiftiFileData( - this.chunkManager, - this.credentialsProvider, + this.sharedKvStoreContext, this.parameters.url, - () => ({ priorityTier: chunk.priorityTier, priority: chunk.priority }), - cancellationToken, + { signal }, ); const imageBuffer = readImage(data.header, data.uncompressedData); await decodeRawChunk( chunk, - cancellationToken, + signal, imageBuffer, data.header.littleEndian ? Endianness.LITTLE : Endianness.BIG, ); diff --git a/src/datasource/nifti/frontend.ts b/src/datasource/nifti/frontend.ts index c61ebdbfb7..35bdceeeb3 100644 --- a/src/datasource/nifti/frontend.ts +++ b/src/datasource/nifti/frontend.ts @@ -20,28 +20,29 @@ */ import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; import { - getCredentialsProviderCounterpart, - WithCredentialsProvider, -} from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { - CompleteUrlOptions, - DataSource, - GetDataSourceOptions, + type DataSource, + type GetKvStoreBasedDataSourceOptions, + type KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import type { NiftiVolumeInfo } from "#src/datasource/nifti/base.js"; import { GET_NIFTI_VOLUME_INFO_RPC_ID, VolumeSourceParameters, } from "#src/datasource/nifti/base.js"; +import type { + AutoDetectFileOptions, + AutoDetectFileSpec, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { makeVolumeChunkSpecificationWithDefaultCompression, @@ -51,29 +52,22 @@ import { MultiscaleVolumeChunkSource, VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; +import { Endianness } from "#src/util/endian.js"; import * as matrix from "#src/util/matrix.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; class NiftiVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeSourceParameters, ) {} export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSource { constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public url: string, public info: NiftiVolumeInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); } get dataType() { return this.info.dataType; @@ -105,7 +99,7 @@ export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSourc chunkSource: this.chunkManager.getChunkSource( NiftiVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { url: this.url }, }, @@ -118,48 +112,37 @@ export class NiftiMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSourc } function getNiftiVolumeInfo( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, - cancellationToken: CancellationToken, + options: Partial, ) { - return chunkManager.rpc!.promiseInvoke( + return sharedKvStoreContext.chunkManager.rpc!.promiseInvoke( GET_NIFTI_VOLUME_INFO_RPC_ID, { - chunkManager: chunkManager.addCounterpartRef(), - credentialsProvider: - getCredentialsProviderCounterpart( - chunkManager, - credentialsProvider, - ), + sharedKvStoreContext: sharedKvStoreContext.rpcId, url: url, }, - cancellationToken, + { signal: options.signal, progressListener: options.progressListener }, ); } function getDataSource( - chunkManager: ChunkManager, - credentialsManager: CredentialsManager, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "nifti/getVolume", url }, - async () => { - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); + options, + async (progressOptions) => { const info = await getNiftiVolumeInfo( - chunkManager, - credentialsProvider, - parsedUrl, - uncancelableToken, + sharedKvStoreContext, + url, + progressOptions, ); const volume = new NiftiMultiscaleVolumeChunkSource( - chunkManager, - credentialsProvider, - parsedUrl, + sharedKvStoreContext, + url, info, ); const box = { @@ -180,6 +163,7 @@ function getDataSource( units: info.units, }); const dataSource: DataSource = { + canonicalUrl: `${url}|nifti:`, subsources: [ { id: "default", @@ -207,23 +191,70 @@ function getDataSource( ); } -export class NiftiDataSource extends DataSourceProvider { +export class NiftiDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "nifti"; + } get description() { - return "Single NIfTI file"; + return "NIfTI"; } - get(options: GetDataSourceOptions): Promise { + get singleFile() { + return true; + } + get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); return getDataSource( - options.chunkManager, - options.credentialsManager, - options.providerUrl, + options.registry.sharedKvStoreContext, + options.kvStoreUrl, + options, ); } +} - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, +function getAutoDetectSpec( + headerSize: number, + magicStringOffset: number, + magicString: string, + version: string, +): AutoDetectFileSpec { + async function match(options: AutoDetectFileOptions) { + const { prefix } = options; + if (prefix.length < magicStringOffset + magicString.length) return []; + const dv = new DataView( + prefix.buffer, + prefix.byteOffset, + prefix.byteLength, ); + let endianness: Endianness; + if (dv.getInt32(0, /*littleEndian=*/ true) === headerSize) { + endianness = Endianness.LITTLE; + } else if (dv.getInt32(0, /*littleEndian=*/ false) === headerSize) { + endianness = Endianness.BIG; + } else { + return []; + } + for (let i = 0; i < magicString.length; ++i) { + if (magicString.charCodeAt(i) !== prefix[i + magicStringOffset]) + return []; + } + + return [ + { + suffix: "nifti:", + description: `NIfTI ${version} (${Endianness[endianness].toLowerCase()}-endian)`, + }, + ]; } + return { + prefixLength: magicStringOffset + magicString.length, + suffixLength: 0, + match, + }; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat(getAutoDetectSpec(348, 344, "n+1\0", "v1")); + registry.registerFileFormat( + getAutoDetectSpec(540, 4, "n+2\0\r\n\x1a\n", "v2"), + ); } diff --git a/src/datasource/nifti/index.rst b/src/datasource/nifti/index.rst new file mode 100644 index 0000000000..33007a9b92 --- /dev/null +++ b/src/datasource/nifti/index.rst @@ -0,0 +1,25 @@ +.. _nifti-datasource: + +NIfTI +===== + +The NIfTI :ref:`data format driver` supports `NIfTI +`__ v1 and v2. + +URL syntax +---------- + +- :file:`{KVSTORE-URL.nii}|nifti:` + +Examples +-------- + +- `https://s3.amazonaws.com/openneuro.org/ds005891/sub-03/ses-01/anat/sub-03_ses-01_T1w.nii.gz|gzip:|nifti: `__ + + `ProactionLab (2025). RSfMRI. OpenNeuro. [Dataset] `__ + +Auto detection +-------------- + +NIfTI files are detected automatically based on the signature at the start of +the file. diff --git a/src/datasource/nifti/register_default.ts b/src/datasource/nifti/register_default.ts index cdf9a6c4ee..41ed086d2f 100644 --- a/src/datasource/nifti/register_default.ts +++ b/src/datasource/nifti/register_default.ts @@ -14,7 +14,18 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { NiftiDataSource } from "#src/datasource/nifti/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + NiftiDataSource, + registerAutoDetect, +} from "#src/datasource/nifti/frontend.js"; -registerProvider("nifti", () => new NiftiDataSource()); +const provider = new NiftiDataSource(); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/obj/backend.ts b/src/datasource/obj/backend.ts index 0cbb36b33a..a19bab62e1 100644 --- a/src/datasource/obj/backend.ts +++ b/src/datasource/obj/backend.ts @@ -16,18 +16,23 @@ import { parseOBJFromArrayBuffer } from "#src/async_computation/obj_mesh_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** - * This needs to be a global function, because it identifies the instance of GenericSharedDataSource + * This needs to be a global function, because it identifies the instance of SimpleAsyncCache * to use. */ -function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { +async function parse( + readResponse: ReadResponse, + progressOptions: Partial, +) { + const buffer = await readResponse.response.arrayBuffer(); return requestAsyncComputation( parseOBJFromArrayBuffer, - cancellationToken, + progressOptions.signal, [buffer], buffer, ); @@ -35,19 +40,6 @@ function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { registerSingleMeshFactory("obj", { description: "OBJ", - getMesh: ( - chunkManager, - credentialsProvider, - url, - getPriority, - cancellationToken, - ) => - GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - parse, - url, - getPriority, - cancellationToken, - ), + getMesh: (sharedKvStoreContext, url, options) => + getCachedDecodedUrl(sharedKvStoreContext, url, parse, options), }); diff --git a/src/datasource/obj/frontend.ts b/src/datasource/obj/frontend.ts deleted file mode 100644 index a5a6e09500..0000000000 --- a/src/datasource/obj/frontend.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { - CompleteUrlOptions, - DataSource, - GetDataSourceOptions, -} from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; -import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; - -export class ObjDataSource extends DataSourceProvider { - get description() { - return "Wavefront OBJ mesh file"; - } - - async get(options: GetDataSourceOptions): Promise { - const meshSource = await getSingleMeshSource( - options.chunkManager, - options.credentialsManager, - options.url, - ); - const modelSpace = makeCoordinateSpace({ - rank: 3, - names: ["x", "y", "z"], - units: ["m", "m", "m"], - scales: Float64Array.of(1e-9, 1e-9, 1e-9), - }); - const dataSource: DataSource = { - modelTransform: makeIdentityTransform(modelSpace), - subsources: [ - { - id: "default", - default: true, - subsource: { singleMesh: meshSource }, - }, - ], - }; - return dataSource; - } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, - ); - } -} diff --git a/src/datasource/obj/register_default.ts b/src/datasource/obj/register_default.ts index 7f846e4743..b7a9b56ec3 100644 --- a/src/datasource/obj/register_default.ts +++ b/src/datasource/obj/register_default.ts @@ -14,7 +14,13 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { ObjDataSource } from "#src/datasource/obj/frontend.js"; +import { + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { SingleMeshDataSource } from "#src/single_mesh/frontend.js"; -registerProvider("obj", () => new ObjDataSource()); +const provider = new SingleMeshDataSource("obj", "Wavefront OBJ mesh"); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/datasource/precomputed/annotation.rst b/src/datasource/precomputed/annotation.rst new file mode 100644 index 0000000000..e9ff7e86b7 --- /dev/null +++ b/src/datasource/precomputed/annotation.rst @@ -0,0 +1,233 @@ +.. _precomputed-annotation-format: + +Annotation format +================= + +The precomputed annotation format defines an annotation collection for a given +n-dimensional coordinate space and one of the following four geometry types: + +- Points (represented by a single position) +- Line segments (represented by the two endpoint positions) +- Axis-aligned bounding boxes (represented by two positions) +- Axis-aligned ellipsoids (represented by a center position and radii vector) + +All annotations within the annotation collection have the same geometry type. + +Each annotation is defined by: + +- A unique uint64 annotation id; +- Position/radii vectors required by the annotation type; +- For each of the :json:schema:`~PrecomputedAnnotation.relationships` specified + in the metadata, a list of associated uint64 ids (typically corresponding to + segmented objects); +- Values for each of the :json:schema:`~PrecomputedAnnotation.properties` + specified in the metadata. + +An annotation collection is represented as a directory tree consisting of the following: + +- :file:`info` file in JSON format specifying the + :json:schema:`metadata`; +- a sub-directory containing the annotations :ref:`indexed by their unique + uint64 annotation ids`; +- for each relationship, a sub-directory containing the annotations + :ref:`indexed by associated object + ids`; +- a set of sub-directories containing a :ref:`multi-level spatial index of the + annotations`. + +:file:`info` metadata file +-------------------------- + +The :file:`info` file is a JSON-format text file with the following schema: + +.. json:schema:: PrecomputedAnnotation + +.. _precomputed-annotation-format-id-index: + +Annotation id index +------------------- + +The annotation id index supports efficient retrieval of individual annotations +by their uint64 id, and is used by Neuroglancer when selecting or hovering over +an annotation. + +The annotation id index maps each uint64 annotation id to the [encoded +representation](#single-annotation-encoding) of the single corresponding +annotation. Depending on whether +:json:schema:`~PrecomputedAnnotation.by_id.sharding` parameters are specified, +the index is stored either in the :ref:`unsharded uint64 index +format` or the +:ref:`sharded uint64 index +format`. + +Note that the geometry and property data is duplicated in all indices, but only the annotation id +index encodes the complete lists of related object ids. + +.. _precomputed-annotation-format-single-annotation-encoding: + +Single annotation encoding +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Within the annotation id index, each annotation is encoded in the following binary format: + +- The position/radii vectors required by the + :json:schema:`~PrecomputedAnnotation.annotation_type` encoded as float32le + values: + + - For :json:`"point"` type, the position vector. + - For :json:`"line"` type, the first endpoint position followed by the second endpoint position. + - For :json:`"axis_aligned_bounding_box"` type, the first position followed by the second position. + - For :json:`"ellipsoid"` type, the center position followed by the radii vector. + +- For each property of type :json:`"uint32"`, :json:`"int32"`, or + :json:`"float32"`: the value encoded as a little endian value. +- For each property of type :json:`"uint16"` or :json:`"int16"`: the value + encoded as a little endian value. +- For each property of type :json:`"uint8"`, :json:`"int8"`, :json:`"rgb"`, or + :json:`"rgba"`: the encoded value. +- Up to 3 padding bytes (with value of 0) to reach a byte offset that is a + multiple of 4. +- For each of the :json:schema:`~PrecomputedAnnotation.relationships` specified + in the :file:`info` metadata file: + + - The number of object ids as a uint32le value. + - Each related object id, as a uint64le value. + +.. _precomputed-annotation-format-unsharded-uint64-index: + +Unsharded uint64 index +~~~~~~~~~~~~~~~~~~~~~~ + +The data corresponding to each uint64 annotation id or related object id is +stored in a file named :file:`{}` within the directory indicated by the +:json:`"key"` member, where :file:`{}` is the base-10 string representation +of the uint64 id. + +.. _precomputed-annotation-format-sharded-uint64-index: + +Sharded uint64 index +~~~~~~~~~~~~~~~~~~~~ + +The uint64 annotation id or related object id is used directly as the key within +the sharded representation within the directory indicated by the :json:`"key"` +member. + +.. _precomputed-annotation-format-related-object-index: + +Related object id index +----------------------- + +The related object id index supports efficient retrieval of the list of annotations associated via a +given relationship with a given object id, and is used by Neuroglancer when filtering by segment +ids. + +The related object id index maps each uint64 object id to the :ref:`encoded +representation` of +the list of related annotations. Depending on whether +:json:schema:`~PrecomputedAnnotation.relationships.sharding` parameters are +specified, the index is stored either in the :ref:`unsharded uint64 index +format` or the +:ref:`sharded uint64 index +format`. + +.. _precomputed-annotation-format-multiple-annotation-encoding: + +Multiple annotation encoding +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Both the related object id index and the spatial index encode lists of +annotations in the following binary format: + +- The number of annotations, ``count``, as a uint64le value. + +- Repeated for ``i = 0`` up to ``count - 1``: + + - The position/radii vectors, the property values, and padding bytes of the + ``i``\ th annotation are encoded exactly as in the :ref:`single annotation + encoding`. + +- Repeated for ``i = 0`` up to ``count - 1``: + + - The annotation id of the ``i``\ th annotation encoded as a uint64le value. + +For the related object id index, the order of the annotations does not matter. +For the spatial index, the annotations should be ordered randomly. + +.. _precomputed-annotation-format-spatial-index: + +Spatial index +------------- + +The spatial index supports efficient retrieval of the set of annotations that +intersects a given bounding box, with optional subsampling down to a desired +maximum density. + +The spatial index is used by Neuroglancer when not filtering by related segment +ids. + +Each spatial index level maps cell positions within the grid specified by the +:json:schema:`~PrecomputedAnnotation.spatial.chunk_size` and +:json:schema:`~PrecomputedAnnotation.spatial.grid_shape` to a spatially uniform +subsample of annotations intersecting that grid cell. + +- A grid cell with coordinates ``cell`` corresponds to a spatial interval in + dimension ``d`` of ``[lower_bound[d] + cell[d] * chunk_size[d], + lower_bound[d] + (cell[d] + 1) * chunk_size[d]]`` +- The ``chunk_size`` for spatial index level ``i+1`` should evenly divide the + ``chunk_size`` for spatial index level ``i``. The grid cells within level + ``i+1`` that are contained within a single level ``i`` grid cell are + considered the child cells. For each level, the elementwise product of the + ``grid_shape`` and the ``chunk_size`` should equal ``upper_bound - + lower_bound``. +- Typically the ``grid_shape`` for level 0 should be a vector of all 1 (with + ``chunk_size`` equal to ``upper_bound - lower_bound``), and each component of + ``chunk_size`` of each successively level should be either equal to, or half + of, the corresponding component of the prior level ``chunk_size``, whichever + results in a more spatially isotropic chunk. + +The spatial index levels should be computed as follows: + +- For each grid position ``cell`` at the coarsest level, compute the set + ``remaining_annotations(0, cell)`` of annotations that intersect the cell. + Note that a single annotation may intersect multiple cells. +- Sequentially generate spatial index ``level``, starting at ``level=0`` (the + coarsest level): + + - Define ``maxCount(level)`` to be the maximum over all ``cell`` positions of + the size of ``remaining_annotations(level, cell)``. + - For each ``cell``: + + - Compute a subset ``emitted(level, cell)`` of ``remaining_annotations(0, cell)`` where each + annotation is chosen uniformly at random with probability ``min(1, limit / maxCount(level))``. + - This spatial index level maps ``cell`` to the list of annotations in + ``emitted(level, cell)``. The annotations are encoded in the + :ref:`multiple annotation + encoding` also + used by the :ref:`related object id + index`; the list + should be ordered randomly (or perhaps pseudo-randomly based on the + annotation id). + - For each ``child_cell`` in level ``level+1`` contained within ``cell``: + Compute the set ``remaining_annotations(level+1, child_cell)`` of + annotations within ``remaining_annotations(level, cell) - emitted(level, + cell)`` that intersect ``child_cell``. + - Continue generating successively finer spatial index levels until no + annotations remain. + +Unsharded spatial index +~~~~~~~~~~~~~~~~~~~~~~~ + +The encoded annotation list corresponding to a grid cell ``cell`` is stored +within the directory indicated by the +:json:schema:`~PrecomputedAnnotation.spatial.key` member in a file named +``cell.join('_')``, i.e. the base-10 string representations of the grid cell +coordinates separated by the ``'_'`` character. For example, cell ``(1, 2, 3)`` +is stored in the file named ``1_2_3``. + +Sharded spatial index +~~~~~~~~~~~~~~~~~~~~~ + +The :ref:`compressed Morton code` of the +grid cell is used as the key within the sharded representation stored in the +directory indicated by the :json:schema:`~PrecomputedAnnotation.spatial.key` +member. diff --git a/src/datasource/precomputed/backend.ts b/src/datasource/precomputed/backend.ts index 4ae0bacf1b..4bf3912530 100644 --- a/src/datasource/precomputed/backend.ts +++ b/src/datasource/precomputed/backend.ts @@ -30,23 +30,24 @@ import { annotationTypeHandlers, annotationTypes, } from "#src/annotation/index.js"; -import type { Chunk, ChunkManager } from "#src/chunk_manager/backend.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import type { ShardingParameters } from "#src/datasource/precomputed/base.js"; import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, - DataEncoding, - IndexedSegmentPropertySourceParameters, MeshSourceParameters, MultiscaleMeshSourceParameters, - ShardingHashFunction, SkeletonSourceParameters, VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/precomputed/base.js"; +import type { + ShardedKvStore, + ShardInfo, +} from "#src/datasource/precomputed/sharded.js"; +import { getShardedKvStoreIfApplicable } from "#src/datasource/precomputed/sharded.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { KvStoreWithPath, ReadResponse } from "#src/kvstore/index.js"; +import { readKvStore } from "#src/kvstore/index.js"; import type { FragmentChunk, ManifestChunk, @@ -64,7 +65,6 @@ import { MultiscaleMeshSource, } from "#src/mesh/backend.js"; import { decodeDracoPartitioned } from "#src/mesh/draco/index.js"; -import { IndexedSegmentPropertySourceBackend } from "#src/segmentation_display_state/backend.js"; import type { SkeletonChunk } from "#src/skeleton/backend.js"; import { SkeletonSource } from "#src/skeleton/backend.js"; import { decodeSkeletonChunk } from "#src/skeleton/decode_precomputed_skeleton.js"; @@ -77,25 +77,8 @@ import { decodePngChunk } from "#src/sliceview/backend_chunk_decoders/png.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import { fetchSpecialHttpByteRange } from "#src/util/byte_range_http_requests.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { convertEndian32, Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; -import { decodeGzip } from "#src/util/gzip.js"; -import { murmurHash3_x86_128Hash64Bits } from "#src/util/hash.js"; -import { - isNotFoundError, - responseArrayBuffer, - responseJson, -} from "#src/util/http_request.js"; -import { stableStringify } from "#src/util/json.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; import { Uint64 } from "#src/util/uint64.js"; import { encodeZIndexCompressed, @@ -107,251 +90,6 @@ import { registerSharedObject } from "#src/worker_rpc.js"; // Set to true to validate the multiscale index. const DEBUG_MULTISCALE_INDEX = false; -const shardingHashFunctions: Map void> = - new Map([ - [ - ShardingHashFunction.MURMURHASH3_X86_128, - (out) => { - murmurHash3_x86_128Hash64Bits(out, 0, out.low, out.high); - }, - ], - [ShardingHashFunction.IDENTITY, (_out) => {}], - ]); - -interface ShardInfo { - shardUrl: string; - offset: Uint64; -} - -interface DecodedMinishardIndex { - data: Uint32Array; - shardUrl: string; -} - -interface MinishardIndexSource - extends GenericSharedDataSource { - sharding: ShardingParameters; - credentialsProvider: SpecialProtocolCredentialsProvider; -} - -function getMinishardIndexDataSource( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - parameters: { url: string; sharding: ShardingParameters | undefined }, -): MinishardIndexSource | undefined { - const { url, sharding } = parameters; - if (sharding === undefined) return undefined; - const source = GenericSharedDataSource.get< - Uint64, - DecodedMinishardIndex | undefined - >( - chunkManager, - stableStringify({ - type: "precomputed:shardedDataSource", - url, - sharding, - credentialsProvider: getObjectId(credentialsProvider), - }), - { - download: async ( - shardAndMinishard: Uint64, - cancellationToken: CancellationToken, - ) => { - const minishard = Uint64.lowMask(new Uint64(), sharding.minishardBits); - Uint64.and(minishard, minishard, shardAndMinishard); - const shard = Uint64.lowMask(new Uint64(), sharding.shardBits); - const temp = new Uint64(); - Uint64.rshift(temp, shardAndMinishard, sharding.minishardBits); - Uint64.and(shard, shard, temp); - const shardUrl = `${url}/${shard - .toString(16) - .padStart(Math.ceil(sharding.shardBits / 4), "0")}.shard`; - // Retrive minishard index start/end offsets. - const shardIndexSize = new Uint64(16); - Uint64.lshift(shardIndexSize, shardIndexSize, sharding.minishardBits); - - // Multiply minishard by 16. - const shardIndexStart = Uint64.lshift(new Uint64(), minishard, 4); - const shardIndexEnd = Uint64.addUint32( - new Uint64(), - shardIndexStart, - 16, - ); - let shardIndexResponse: ArrayBuffer; - try { - shardIndexResponse = await fetchSpecialHttpByteRange( - credentialsProvider, - shardUrl, - shardIndexStart, - shardIndexEnd, - cancellationToken, - ); - } catch (e) { - if (isNotFoundError(e)) return { data: undefined, size: 0 }; - throw e; - } - if (shardIndexResponse.byteLength !== 16) { - throw new Error("Failed to retrieve minishard offset"); - } - const shardIndexDv = new DataView(shardIndexResponse); - const minishardStartOffset = new Uint64( - shardIndexDv.getUint32(0, /*littleEndian=*/ true), - shardIndexDv.getUint32(4, /*littleEndian=*/ true), - ); - const minishardEndOffset = new Uint64( - shardIndexDv.getUint32(8, /*littleEndian=*/ true), - shardIndexDv.getUint32(12, /*littleEndian=*/ true), - ); - if (Uint64.equal(minishardStartOffset, minishardEndOffset)) { - return { data: undefined, size: 0 }; - } - // The start/end offsets in the shard index are relative to the end of the shard - // index. - Uint64.add(minishardStartOffset, minishardStartOffset, shardIndexSize); - Uint64.add(minishardEndOffset, minishardEndOffset, shardIndexSize); - - let minishardIndexResponse = await fetchSpecialHttpByteRange( - credentialsProvider, - shardUrl, - minishardStartOffset, - minishardEndOffset, - cancellationToken, - ); - if (sharding.minishardIndexEncoding === DataEncoding.GZIP) { - minishardIndexResponse = await decodeGzip(minishardIndexResponse); - } - if (minishardIndexResponse.byteLength % 24 !== 0) { - throw new Error( - `Invalid minishard index length: ${minishardIndexResponse.byteLength}`, - ); - } - const minishardIndex = new Uint32Array(minishardIndexResponse); - convertEndian32(minishardIndex, Endianness.LITTLE); - - const minishardIndexSize = minishardIndex.byteLength / 24; - let prevEntryKeyLow = 0; - let prevEntryKeyHigh = 0; - // Offsets in the minishard index are relative to the end of the shard index. - let prevStartLow = shardIndexSize.low; - let prevStartHigh = shardIndexSize.high; - for (let i = 0; i < minishardIndexSize; ++i) { - let entryKeyLow = prevEntryKeyLow + minishardIndex[i * 2]; - let entryKeyHigh = prevEntryKeyHigh + minishardIndex[i * 2 + 1]; - if (entryKeyLow >= 4294967296) { - entryKeyLow -= 4294967296; - entryKeyHigh += 1; - } - prevEntryKeyLow = minishardIndex[i * 2] = entryKeyLow; - prevEntryKeyHigh = minishardIndex[i * 2 + 1] = entryKeyHigh; - let startLow = - prevStartLow + minishardIndex[(minishardIndexSize + i) * 2]; - let startHigh = - prevStartHigh + minishardIndex[(minishardIndexSize + i) * 2 + 1]; - if (startLow >= 4294967296) { - startLow -= 4294967296; - startHigh += 1; - } - minishardIndex[(minishardIndexSize + i) * 2] = startLow; - minishardIndex[(minishardIndexSize + i) * 2 + 1] = startHigh; - const sizeLow = minishardIndex[(2 * minishardIndexSize + i) * 2]; - const sizeHigh = minishardIndex[(2 * minishardIndexSize + i) * 2 + 1]; - let endLow = startLow + sizeLow; - let endHigh = startHigh + sizeHigh; - if (endLow >= 4294967296) { - endLow -= 4294967296; - endHigh += 1; - } - prevStartLow = endLow; - prevStartHigh = endHigh; - minishardIndex[(2 * minishardIndexSize + i) * 2] = endLow; - minishardIndex[(2 * minishardIndexSize + i) * 2 + 1] = endHigh; - } - return { - data: { data: minishardIndex, shardUrl }, - size: minishardIndex.byteLength, - }; - }, - encodeKey: (key: Uint64) => key.toString(), - sourceQueueLevel: 1, - }, - ) as MinishardIndexSource; - source.sharding = sharding; - source.credentialsProvider = credentialsProvider; - return source; -} - -function findMinishardEntry( - minishardIndex: DecodedMinishardIndex, - key: Uint64, -): { startOffset: Uint64; endOffset: Uint64 } | undefined { - const minishardIndexData = minishardIndex.data; - const minishardIndexSize = minishardIndexData.length / 6; - const keyLow = key.low; - const keyHigh = key.high; - for (let i = 0; i < minishardIndexSize; ++i) { - if ( - minishardIndexData[i * 2] !== keyLow || - minishardIndexData[i * 2 + 1] !== keyHigh - ) { - continue; - } - const startOffset = new Uint64( - minishardIndexData[(minishardIndexSize + i) * 2], - minishardIndexData[(minishardIndexSize + i) * 2 + 1], - ); - const endOffset = new Uint64( - minishardIndexData[(2 * minishardIndexSize + i) * 2], - minishardIndexData[(2 * minishardIndexSize + i) * 2 + 1], - ); - return { startOffset, endOffset }; - } - return undefined; -} - -async function getShardedData( - minishardIndexSource: MinishardIndexSource, - chunk: Chunk, - key: Uint64, - cancellationToken: CancellationToken, -): Promise<{ shardInfo: ShardInfo; data: ArrayBuffer } | undefined> { - const { sharding } = minishardIndexSource; - const hashFunction = shardingHashFunctions.get(sharding.hash)!; - const hashCode = Uint64.rshift(new Uint64(), key, sharding.preshiftBits); - hashFunction(hashCode); - const shardAndMinishard = Uint64.lowMask( - new Uint64(), - sharding.minishardBits + sharding.shardBits, - ); - Uint64.and(shardAndMinishard, shardAndMinishard, hashCode); - const getPriority = () => ({ - priorityTier: chunk.priorityTier, - priority: chunk.priority, - }); - const minishardIndex = await minishardIndexSource.getData( - shardAndMinishard, - getPriority, - cancellationToken, - ); - if (minishardIndex === undefined) return undefined; - const minishardEntry = findMinishardEntry(minishardIndex, key); - if (minishardEntry === undefined) return undefined; - const { startOffset, endOffset } = minishardEntry; - let data = await fetchSpecialHttpByteRange( - minishardIndexSource.credentialsProvider, - minishardIndex.shardUrl, - startOffset, - endOffset, - cancellationToken, - ); - if (minishardIndexSource.sharding.dataEncoding === DataEncoding.GZIP) { - data = await decodeGzip(data); - } - return { - data, - shardInfo: { shardUrl: minishardIndex.shardUrl, offset: startOffset }, - }; -} - function getOrNotFoundError(v: T | undefined) { if (v === undefined) throw new Error("not found"); return v; @@ -370,16 +108,17 @@ chunkDecoders.set(VolumeChunkEncoding.JXL, decodeJxlChunk); @registerSharedObject() export class PrecomputedVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { chunkDecoder = chunkDecoders.get(this.parameters.encoding)!; - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.sharding, ); gridShape = (() => { @@ -391,43 +130,25 @@ export class PrecomputedVolumeChunkSource extends WithParameters( return gridShape; })(); - async download( - chunk: VolumeChunk, - cancellationToken: CancellationToken, - ): Promise { - const { parameters } = this; - - const { minishardIndexSource } = this; - let response: ArrayBuffer | undefined; - if (minishardIndexSource === undefined) { - let url: string; + async download(chunk: VolumeChunk, signal: AbortSignal): Promise { + const { shardedKvStore } = this; + let readResponse: ReadResponse | undefined; + if (shardedKvStore === undefined) { + const { kvStore } = this; + let path: string; { // chunkPosition must not be captured, since it will be invalidated by the next call to // computeChunkBounds. const chunkPosition = this.computeChunkBounds(chunk); const chunkDataSize = chunk.chunkDataSize!; - url = - `${parameters.url}/${chunkPosition[0]}-${ + path = + `${kvStore.path}${chunkPosition[0]}-${ chunkPosition[0] + chunkDataSize[0] }_` + `${chunkPosition[1]}-${chunkPosition[1] + chunkDataSize[1]}_` + `${chunkPosition[2]}-${chunkPosition[2] + chunkDataSize[2]}`; } - try { - response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); - } catch (e) { - if (isNotFoundError(e)) { - response = undefined; - } else { - throw e; - } - } + readResponse = await kvStore.store.read(path, { signal }); } else { this.computeChunkBounds(chunk); const { gridShape } = this; @@ -436,7 +157,6 @@ export class PrecomputedVolumeChunkSource extends WithParameters( const yBits = Math.ceil(Math.log2(gridShape[1])); const zBits = Math.ceil(Math.log2(gridShape[2])); const chunkIndex = encodeZIndexCompressed3d( - new Uint64(), xBits, yBits, zBits, @@ -444,17 +164,14 @@ export class PrecomputedVolumeChunkSource extends WithParameters( chunkGridPosition[1], chunkGridPosition[2], ); - response = ( - await getShardedData( - minishardIndexSource, - chunk, - chunkIndex, - cancellationToken, - ) - )?.data; + readResponse = await shardedKvStore.read(chunkIndex, { signal }); } - if (response !== undefined) { - await this.chunkDecoder(chunk, cancellationToken, response); + if (readResponse !== undefined) { + await this.chunkDecoder( + chunk, + signal, + await readResponse.response.arrayBuffer(), + ); } } } @@ -482,36 +199,30 @@ export function decodeFragmentChunk( @registerSharedObject() export class PrecomputedMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MeshSource, - ), + WithSharedKvStoreContextCounterpart(MeshSource), MeshSourceParameters, ) { - async download(chunk: ManifestChunk, cancellationToken: CancellationToken) { - const { parameters } = this; - const response = await cancellableFetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.objectId}:${parameters.lod}`, - {}, - responseJson, - cancellationToken, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + async download(chunk: ManifestChunk, signal: AbortSignal) { + const { parameters, kvStore } = this; + const response = await readKvStore( + kvStore.store, + `${kvStore.path}${chunk.objectId}:${parameters.lod}`, + { signal, throwIfMissing: true }, ); - decodeManifestChunk(chunk, response); + decodeManifestChunk(chunk, await response.response.json()); } - async downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ) { - const { parameters } = this; - const response = await cancellableFetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.fragmentId}`, - {}, - responseArrayBuffer, - cancellationToken, + async downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { + const { kvStore } = this; + const response = await readKvStore( + kvStore.store, + `${kvStore.path}${chunk.fragmentId}`, + { signal, throwIfMissing: true }, ); - decodeFragmentChunk(chunk, response); + decodeFragmentChunk(chunk, await response.response.arrayBuffer()); } } @@ -759,152 +470,128 @@ async function decodeMultiscaleFragmentChunk( @registerSharedObject() // export class PrecomputedMultiscaleMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - MultiscaleMeshSource, - ), + WithSharedKvStoreContextCounterpart(MultiscaleMeshSource), MultiscaleMeshSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - { url: this.parameters.url, sharding: this.parameters.metadata.sharding }, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.metadata.sharding, ); async download( chunk: PrecomputedMultiscaleManifestChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise { - const { parameters, minishardIndexSource } = this; - let data: ArrayBuffer; - if (minishardIndexSource === undefined) { - data = await cancellableFetchSpecialOk( - this.credentialsProvider, - `${parameters.url}/${chunk.objectId}.index`, - {}, - responseArrayBuffer, - cancellationToken, + const { shardedKvStore } = this; + let readResponse: ReadResponse | undefined; + if (shardedKvStore === undefined) { + const { kvStore } = this; + readResponse = await kvStore.store.read( + `${kvStore.path}${chunk.objectId}.index`, + { signal }, ); } else { - ({ data, shardInfo: chunk.shardInfo } = getOrNotFoundError( - await getShardedData( - minishardIndexSource, - chunk, - chunk.objectId, - cancellationToken, - ), - )); + ({ response: readResponse, shardInfo: chunk.shardInfo } = + getOrNotFoundError( + await shardedKvStore.readWithShardInfo(chunk.objectId.toBigInt(), { + signal, + }), + )); } + + const data = await getOrNotFoundError(readResponse).response.arrayBuffer(); + decodeMultiscaleManifestChunk(chunk, data); } async downloadFragment( chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise { - const { parameters } = this; + const { kvStore } = this; const manifestChunk = chunk.manifestChunk! as PrecomputedMultiscaleManifestChunk; const chunkIndex = chunk.chunkIndex; const { shardInfo, offsets } = manifestChunk; const startOffset = offsets[chunkIndex]; const endOffset = offsets[chunkIndex + 1]; - let requestUrl: string; - let adjustedStartOffset: Uint64 | number; - let adjustedEndOffset: Uint64 | number; + let requestPath: string; + let adjustedStartOffset: number; + let adjustedEndOffset: number; if (shardInfo !== undefined) { - requestUrl = shardInfo.shardUrl; + requestPath = shardInfo.shardPath; const fullDataSize = offsets[offsets.length - 1]; - let startLow = shardInfo.offset.low - fullDataSize + startOffset; - let startHigh = shardInfo.offset.high; - let endLow = startLow + endOffset - startOffset; - let endHigh = startHigh; - while (startLow < 0) { - startLow += 4294967296; - startHigh -= 1; - } - while (endLow < 0) { - endLow += 4294967296; - endHigh -= 1; - } - while (endLow > 4294967296) { - endLow -= 4294967296; - endHigh += 1; - } - adjustedStartOffset = new Uint64(startLow, startHigh); - adjustedEndOffset = new Uint64(endLow, endHigh); + const start = shardInfo.offset - fullDataSize + startOffset; + const end = start + endOffset - startOffset; + adjustedStartOffset = start; + adjustedEndOffset = end; } else { - requestUrl = `${parameters.url}/${manifestChunk.objectId}`; + requestPath = `${kvStore.path}${manifestChunk.objectId}`; adjustedStartOffset = startOffset; adjustedEndOffset = endOffset; } - const response = await fetchSpecialHttpByteRange( - this.credentialsProvider, - requestUrl, - adjustedStartOffset, - adjustedEndOffset, - cancellationToken, + const readResponse = await readKvStore(kvStore.store, requestPath, { + signal, + byteRange: { + offset: adjustedStartOffset, + length: adjustedEndOffset - adjustedStartOffset, + }, + throwIfMissing: true, + strictByteRange: true, + }); + await decodeMultiscaleFragmentChunk( + chunk, + await readResponse.response.arrayBuffer(), ); - await decodeMultiscaleFragmentChunk(chunk, response); } } async function fetchByUint64( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - chunk: Chunk, - minishardIndexSource: MinishardIndexSource | undefined, + chunkSource: { + kvStore: KvStoreWithPath; + shardedKvStore: ShardedKvStore | undefined; + }, id: Uint64, - cancellationToken: CancellationToken, -) { - if (minishardIndexSource === undefined) { - try { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/${id}`, - {}, - responseArrayBuffer, - cancellationToken, - ); - } catch (e) { - if (isNotFoundError(e)) return undefined; - throw e; - } + signal: AbortSignal, +): Promise { + const { shardedKvStore } = chunkSource; + if (shardedKvStore === undefined) { + const { kvStore } = chunkSource; + return kvStore.store.read(`${kvStore.path}${id}`, { + signal, + }); + } else { + return shardedKvStore.read(id.toBigInt(), { signal }); } - const result = await getShardedData( - minishardIndexSource, - chunk, - id, - cancellationToken, - ); - if (result === undefined) return undefined; - return result.data; } @registerSharedObject() // export class PrecomputedSkeletonSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - SkeletonSource, - ), + WithSharedKvStoreContextCounterpart(SkeletonSource), SkeletonSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - { url: this.parameters.url, sharding: this.parameters.metadata.sharding }, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, + ); + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.metadata.sharding, ); - async download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + async download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const response = getOrNotFoundError( - await fetchByUint64( - this.credentialsProvider, - parameters.url, - chunk, - this.minishardIndexSource, - chunk.objectId, - cancellationToken, - ), + await fetchByUint64(this, chunk.objectId, signal), + ); + decodeSkeletonChunk( + chunk, + await response.response.arrayBuffer(), + parameters.metadata.vertexAttributes, ); - decodeSkeletonChunk(chunk, response, parameters.metadata.vertexAttributes); } } @@ -935,7 +622,7 @@ function parseAnnotations( } const geometryData = new AnnotationGeometryData(); const origData = new Uint8Array(buffer, 8, numBytes * countLow); - let data: Uint8Array; + let data: Uint8Array; const { propertyGroupBytes } = propertySerializer; if (propertyGroupBytes.length > 1) { // Need to transpose the property data. @@ -1047,59 +734,39 @@ function parseSingleAnnotation( @registerSharedObject() // export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - AnnotationGeometryChunkSourceBackend, - ), + WithSharedKvStoreContextCounterpart(AnnotationGeometryChunkSourceBackend), AnnotationSpatialIndexSourceParameters, ) { - private minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.url, ); - parent: PrecomputedAnnotationSourceBackend; - async download( - chunk: AnnotationGeometryChunk, - cancellationToken: CancellationToken, - ) { - const { parameters } = this; - - const { minishardIndexSource } = this; + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.sharding, + ); + declare parent: PrecomputedAnnotationSourceBackend; + async download(chunk: AnnotationGeometryChunk, signal: AbortSignal) { + const { shardedKvStore } = this; const { parent } = this; - let response: ArrayBuffer | undefined; + let response: ReadResponse | undefined; const { chunkGridPosition } = chunk; - if (minishardIndexSource === undefined) { - const url = `${parameters.url}/${chunkGridPosition.join("_")}`; - try { - response = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - {}, - responseArrayBuffer, - cancellationToken, - ); - } catch (e) { - if (!isNotFoundError(e)) throw e; - } + if (shardedKvStore === undefined) { + const { kvStore } = this; + const path = `${kvStore.path}${chunkGridPosition.join("_")}`; + response = await kvStore.store.read(path, { signal }); } else { const { upperChunkBound } = this.spec; const { chunkGridPosition } = chunk; const chunkIndex = encodeZIndexCompressed( - new Uint64(), chunkGridPosition, upperChunkBound, ); - const result = await getShardedData( - minishardIndexSource, - chunk, - chunkIndex, - cancellationToken, - ); - if (result !== undefined) response = result.data; + response = await shardedKvStore.read(chunkIndex, { signal }); } if (response !== undefined) { chunk.data = parseAnnotations( - response, + await response.response.arrayBuffer(), parent.parameters, parent.annotationPropertySerializer, ); @@ -1109,19 +776,26 @@ export class PrecomputedAnnotationSpatialIndexSourceBackend extends WithParamete @registerSharedObject() // export class PrecomputedAnnotationSourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - AnnotationSource, - ), + WithSharedKvStoreContextCounterpart(AnnotationSource), AnnotationSourceParameters, ) { - private byIdMinishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters.byId, + kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore( + this.parameters.byId.url, ); - private relationshipIndexSource = this.parameters.relationships.map((x) => - getMinishardIndexDataSource(this.chunkManager, this.credentialsProvider, x), + shardedKvStore = getShardedKvStoreIfApplicable( + this, + this.kvStore, + this.parameters.byId.sharding, ); + private relationshipIndexSource = this.parameters.relationships.map((x) => { + const kvStore = this.sharedKvStoreContext.kvStoreContext.getKvStore(x.url); + const shardedKvStore = getShardedKvStoreIfApplicable( + this, + kvStore, + x.sharding, + ); + return { kvStore, shardedKvStore }; + }); annotationPropertySerializer = new AnnotationPropertySerializer( this.parameters.rank, annotationTypeHandlers[this.parameters.type].serializedBytes( @@ -1133,45 +807,30 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( async downloadSegmentFilteredGeometry( chunk: AnnotationSubsetGeometryChunk, relationshipIndex: number, - cancellationToken: CancellationToken, + signal: AbortSignal, ) { - const { parameters } = this; const response = await fetchByUint64( - this.credentialsProvider, - parameters.relationships[relationshipIndex].url, - chunk, this.relationshipIndexSource[relationshipIndex], chunk.objectId, - cancellationToken, + signal, ); if (response !== undefined) { chunk.data = parseAnnotations( - response, + await response.response.arrayBuffer(), this.parameters, this.annotationPropertySerializer, ); } } - async downloadMetadata( - chunk: AnnotationMetadataChunk, - cancellationToken: CancellationToken, - ) { - const { parameters } = this; + async downloadMetadata(chunk: AnnotationMetadataChunk, signal: AbortSignal) { const id = Uint64.parseString(chunk.key!); - const response = await fetchByUint64( - this.credentialsProvider, - parameters.byId.url, - chunk, - this.byIdMinishardIndexSource, - id, - cancellationToken, - ); + const response = await fetchByUint64(this, id, signal); if (response === undefined) { chunk.annotation = null; } else { chunk.annotation = parseSingleAnnotation( - response, + await response.response.arrayBuffer(), this.parameters, this.annotationPropertySerializer, chunk.key!, @@ -1179,17 +838,3 @@ export class PrecomputedAnnotationSourceBackend extends WithParameters( } } } - -@registerSharedObject() -export class PrecomputedIndexedSegmentPropertySourceBackend extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - IndexedSegmentPropertySourceBackend, - ), - IndexedSegmentPropertySourceParameters, -) { - minishardIndexSource = getMinishardIndexDataSource( - this.chunkManager, - this.credentialsProvider, - this.parameters, - ); -} diff --git a/src/datasource/precomputed/frontend.ts b/src/datasource/precomputed/frontend.ts index 3ee7808d4b..69393aca7e 100644 --- a/src/datasource/precomputed/frontend.ts +++ b/src/datasource/precomputed/frontend.ts @@ -37,16 +37,15 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; -import type { - CompleteUrlOptions, - ConvertLegacyUrlOptions, - DataSource, - DataSubsourceEntry, - GetDataSourceOptions, - NormalizeUrlOptions, +import { + KvStoreBasedDataSourceLegacyUrlAdapter, + type ConvertLegacyUrlOptions, + type DataSource, + type DataSourceLookupResult, + type DataSubsourceEntry, + type GetKvStoreBasedDataSourceOptions, + type KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider, RedirectError } from "#src/datasource/index.js"; import type { MultiscaleMeshMetadata, ShardingParameters, @@ -56,7 +55,6 @@ import { AnnotationSourceParameters, AnnotationSpatialIndexSourceParameters, DataEncoding, - IndexedSegmentPropertySourceParameters, MeshSourceParameters, MultiscaleMeshSourceParameters, ShardingHashFunction, @@ -64,6 +62,16 @@ import { VolumeChunkEncoding, VolumeChunkSourceParameters, } from "#src/datasource/precomputed/base.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { KvStoreContext } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + kvstoreEnsureDirectoryPipelineUrl, + parseUrlSuffix, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import { VertexPositionFormat } from "#src/mesh/base.js"; import { MeshSource, MultiscaleMeshSource } from "#src/mesh/frontend.js"; import type { @@ -71,7 +79,6 @@ import type { InlineSegmentPropertyMap, } from "#src/segmentation_display_state/property_map.js"; import { - IndexedSegmentPropertySource, normalizeInlineSegmentPropertyMap, SegmentPropertyMap, } from "#src/segmentation_display_state/property_map.js"; @@ -90,10 +97,7 @@ import { } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; -import type { Borrowed } from "#src/util/disposable.js"; import { mat4, vec3 } from "#src/util/geom.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError, responseJson } from "#src/util/http_request.js"; import { parseArray, parseFixedLengthArray, @@ -113,34 +117,27 @@ import { verifyOptionalBoolean, } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { Uint64 } from "#src/util/uint64.js"; export class PrecomputedVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} class PrecomputedMeshSource extends WithParameters( - WithCredentialsProvider()(MeshSource), + WithSharedKvStoreContext(MeshSource), MeshSourceParameters, ) {} class PrecomputedMultiscaleMeshSource extends WithParameters( - WithCredentialsProvider()(MultiscaleMeshSource), + WithSharedKvStoreContext(MultiscaleMeshSource), MultiscaleMeshSourceParameters, ) {} class PrecomputedSkeletonSource extends WithParameters( - WithCredentialsProvider()(SkeletonSource), + WithSharedKvStoreContext(SkeletonSource), SkeletonSourceParameters, ) { get skeletonVertexCoordinatesInVoxels() { @@ -151,20 +148,6 @@ class PrecomputedSkeletonSource extends WithParameters( } } -export function resolvePath(a: string, b: string) { - const outputParts = a.split("/"); - for (const part of b.split("/")) { - if (part === "..") { - if (outputParts.length !== 0) { - outputParts.length = outputParts.length - 1; - continue; - } - } - outputParts.push(part); - } - return outputParts.join("/"); -} - class ScaleInfo { key: string; encoding: VolumeChunkEncoding; @@ -325,12 +308,11 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun } constructor( - chunkManager: ChunkManager, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public url: string, public info: MultiscaleVolumeInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); } getSources(volumeSourceOptions: VolumeSourceOptions) { @@ -380,10 +362,15 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun chunkSource: this.chunkManager.getChunkSource( PrecomputedVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { - url: resolvePath(this.url, scaleInfo.key), + url: kvstoreEnsureDirectoryPipelineUrl( + this.sharedKvStoreContext.kvStoreContext.resolveRelativePath( + this.url, + scaleInfo.key, + ), + ), encoding: scaleInfo.encoding, sharding: scaleInfo.sharding, }, @@ -400,30 +387,25 @@ export class PrecomputedMultiscaleVolumeChunkSource extends MultiscaleVolumeChun } const MultiscaleAnnotationSourceBase = WithParameters( - WithCredentialsProvider()( - MultiscaleAnnotationSource, - ), + WithSharedKvStoreContext(MultiscaleAnnotationSource), AnnotationSourceParameters, ); class PrecomputedAnnotationSpatialIndexSource extends WithParameters( - WithCredentialsProvider()( - AnnotationGeometryChunkSource, - ), + WithSharedKvStoreContext(AnnotationGeometryChunkSource), AnnotationSpatialIndexSourceParameters, ) {} interface PrecomputedAnnotationSourceOptions { metadata: AnnotationMetadata; parameters: AnnotationSourceParameters; - credentialsProvider: SpecialProtocolCredentialsProvider; + sharedKvStoreContext: SharedKvStoreContext; } export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase { - key: any; + declare key: any; metadata: AnnotationMetadata; - credentialsProvider: SpecialProtocolCredentialsProvider; - OPTIONS: PrecomputedAnnotationSourceOptions; + declare OPTIONS: PrecomputedAnnotationSourceOptions; constructor( chunkManager: ChunkManager, options: PrecomputedAnnotationSourceOptions, @@ -433,11 +415,11 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase rank: parameters.rank, relationships: parameters.relationships.map((x) => x.name), properties: parameters.properties, + sharedKvStoreContext: options.sharedKvStoreContext, parameters, } as any); this.readonly = true; this.metadata = options.metadata; - this.credentialsProvider = options.credentialsProvider; } getSources(): SliceViewSingleResolutionSource[][] { @@ -448,7 +430,7 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase chunkSource: this.chunkManager.getChunkSource( PrecomputedAnnotationSpatialIndexSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, parent: this, spec, parameters: spatialIndexLevel.parameters, @@ -462,14 +444,16 @@ export class PrecomputedAnnotationSource extends MultiscaleAnnotationSourceBase } function getLegacyMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, parameters: MeshSourceParameters, ) { - return chunkManager.getChunkSource(PrecomputedMeshSource, { - parameters, - credentialsProvider, - }); + return sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedMeshSource, + { + parameters, + sharedKvStoreContext, + }, + ); } function parseTransform(data: any): mat4 { @@ -533,20 +517,20 @@ function parseMeshMetadata(data: any): ParsedMeshMetadata { } async function getMeshMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { - let metadata: any; - try { - metadata = await getJsonMetadata(chunkManager, credentialsProvider, url); - } catch (e) { - if (isNotFoundError(e)) { - // If we fail to fetch the info file, assume it is the legacy - // single-resolution mesh format. - return { metadata: undefined }; - } - throw e; + const metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ false, + options, + ); + if (metadata === undefined) { + // If the info file is missing, assume it is the legacy + // single-resolution mesh format. + return { metadata: undefined }; } return parseMeshMetadata(metadata); } @@ -649,14 +633,15 @@ function parseSkeletonMetadata(data: any): ParsedSkeletonMetadata { } async function getSkeletonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const metadata = await getJsonMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + /*required=*/ true, + options, ); return parseSkeletonMetadata(metadata); } @@ -670,18 +655,18 @@ function getDefaultCoordinateSpace() { } async function getMeshSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { const { metadata, segmentPropertyMap } = await getMeshMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + options, ); if (metadata === undefined) { return { - source: getLegacyMeshSource(chunkManager, credentialsProvider, { + source: getLegacyMeshSource(sharedKvStoreContext, { url, lod: 0, }), @@ -701,60 +686,71 @@ async function getMeshSource( ); } return { - source: chunkManager.getChunkSource(PrecomputedMultiscaleMeshSource, { - credentialsProvider, - parameters: { url, metadata }, - format: { - fragmentRelativeVertices: true, - vertexPositionFormat, + source: sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedMultiscaleMeshSource, + { + sharedKvStoreContext, + parameters: { url, metadata }, + format: { + fragmentRelativeVertices: true, + vertexPositionFormat, + }, }, - }), + ), transform: metadata.transform, segmentPropertyMap, }; } async function getSkeletonSource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { const { metadata, segmentPropertyMap } = await getSkeletonMetadata( - chunkManager, - credentialsProvider, + sharedKvStoreContext, url, + options, ); return { - source: chunkManager.getChunkSource(PrecomputedSkeletonSource, { - credentialsProvider, - parameters: { - url, - metadata, + source: sharedKvStoreContext.chunkManager.getChunkSource( + PrecomputedSkeletonSource, + { + sharedKvStoreContext, + parameters: { + url, + metadata, + }, }, - }), + ), transform: metadata.transform, segmentPropertyMap, }; } -function getJsonMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, +export function getJsonMetadata( + sharedKvStoreContext: SharedKvStoreContext, url: string, + required: boolean, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "precomputed:metadata", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - return await cancellableFetchSpecialOk( - credentialsProvider, - `${url}/info`, - {}, - responseJson, - ); + options, + async (options) => { + const infoUrl = pipelineUrlJoin(url, "info"); + using _span = new ProgressSpan(options.progressListener, { + message: `Reading neuroglancer_precomputed metadata from ${infoUrl}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read(infoUrl, { + ...options, + throwIfMissing: required, + }); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -769,15 +765,14 @@ function getSubsourceToModelSubspaceTransform(info: MultiscaleVolumeInfo) { } async function getVolumeDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, + options: Partial, ): Promise { const info = parseMultiscaleVolumeInfo(metadata); const volume = new PrecomputedMultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, url, info, ); @@ -799,18 +794,19 @@ async function getVolumeDataSource( }, ]; if (info.segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, info.segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.segmentPropertyMap, + ), ); - const segmentPropertyMap = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMap = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -818,11 +814,13 @@ async function getVolumeDataSource( }); } if (info.mesh !== undefined) { - const meshUrl = resolvePath(url, info.mesh); + const meshUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath(url, info.mesh), + ); const { source: meshSource, transform } = await getMeshSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, meshUrl, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -839,11 +837,16 @@ async function getVolumeDataSource( }); } if (info.skeletons !== undefined) { - const skeletonsUrl = resolvePath(url, info.skeletons); + const skeletonsUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + info.skeletons, + ), + ); const { source: skeletonSource, transform } = await getSkeletonSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, skeletonsUrl, + options, ); const subsourceToModelSubspaceTransform = getSubsourceToModelSubspaceTransform(info); @@ -863,15 +866,15 @@ async function getVolumeDataSource( } async function getSkeletonsDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const { source: skeletons, transform, segmentPropertyMap, - } = await getSkeletonSource(options.chunkManager, credentialsProvider, url); + } = await getSkeletonSource(sharedKvStoreContext, url, options); const subsources: DataSubsourceEntry[] = [ { id: "default", @@ -881,18 +884,19 @@ async function getSkeletonsDataSource( }, ]; if (segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + segmentPropertyMap, + ), ); - const segmentPropertyMapData = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMapData = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -905,10 +909,17 @@ async function getSkeletonsDataSource( }; } -function parseKeyAndShardingSpec(url: string, obj: any) { +function parseKeyAndShardingSpec( + kvStoreContext: KvStoreContext, + url: string, + obj: any, +) { verifyObject(obj); + const relativePath = verifyObjectProperty(obj, "key", verifyString); return { - url: resolvePath(url, verifyObjectProperty(obj, "key", verifyString)), + url: kvstoreEnsureDirectoryPipelineUrl( + kvStoreContext.resolveRelativePath(url, relativePath), + ), sharding: verifyObjectProperty(obj, "sharding", parseShardingParameters), }; } @@ -924,6 +935,7 @@ class AnnotationMetadata { parameters: AnnotationSourceParameters; spatialIndices: AnnotationSpatialIndexLevelMetadata[]; constructor( + kvStoreContext: KvStoreContext, public url: string, metadata: any, ) { @@ -973,7 +985,7 @@ class AnnotationMetadata { "relationships", (relsObj) => parseArray(relsObj, (relObj) => { - const common = parseKeyAndShardingSpec(url, relObj); + const common = parseKeyAndShardingSpec(kvStoreContext, url, relObj); const name = verifyObjectProperty(relObj, "id", verifyString); return { ...common, name }; }), @@ -984,7 +996,7 @@ class AnnotationMetadata { parseAnnotationPropertySpecs, ), byId: verifyObjectProperty(metadata, "by_id", (obj) => - parseKeyAndShardingSpec(url, obj), + parseKeyAndShardingSpec(kvStoreContext, url, obj), ), }; this.spatialIndices = verifyObjectProperty( @@ -993,7 +1005,7 @@ class AnnotationMetadata { (spatialObj) => parseArray(spatialObj, (levelObj) => { const common: AnnotationSpatialIndexSourceParameters = - parseKeyAndShardingSpec(url, levelObj); + parseKeyAndShardingSpec(kvStoreContext, url, levelObj); const gridShape = verifyObjectProperty(levelObj, "grid_shape", (j) => parseFixedLengthArray(new Float32Array(rank), j, verifyPositiveInt), ); @@ -1041,13 +1053,16 @@ class AnnotationMetadata { } } -async function getAnnotationDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, +function getAnnotationDataSource( + sharedKvStoreContext: SharedKvStoreContext, url: string, metadata: any, -): Promise { - const info = new AnnotationMetadata(url, metadata); +): DataSource { + const info = new AnnotationMetadata( + sharedKvStoreContext.kvStoreContext, + url, + metadata, + ); const dataSource: DataSource = { modelTransform: makeIdentityTransform(info.coordinateSpace), subsources: [ @@ -1055,10 +1070,10 @@ async function getAnnotationDataSource( id: "default", default: true, subsource: { - annotation: options.chunkManager.getChunkSource( + annotation: sharedKvStoreContext.chunkManager.getChunkSource( PrecomputedAnnotationSource, { - credentialsProvider, + sharedKvStoreContext, metadata: info, parameters: info.parameters, }, @@ -1071,15 +1086,15 @@ async function getAnnotationDataSource( } async function getMeshDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ): Promise { const { source: mesh, transform, segmentPropertyMap, - } = await getMeshSource(options.chunkManager, credentialsProvider, url); + } = await getMeshSource(sharedKvStoreContext, url, options); const subsources: DataSubsourceEntry[] = [ { id: "default", @@ -1089,18 +1104,19 @@ async function getMeshDataSource( }, ]; if (segmentPropertyMap !== undefined) { - const mapUrl = resolvePath(url, segmentPropertyMap); - const metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - mapUrl, + const mapUrl = kvstoreEnsureDirectoryPipelineUrl( + sharedKvStoreContext.kvStoreContext.resolveRelativePath( + url, + segmentPropertyMap, + ), ); - const segmentPropertyMapData = getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, + const metadata = await getJsonMetadata( + sharedKvStoreContext, mapUrl, + /*required=*/ true, + options, ); + const segmentPropertyMapData = getSegmentPropertyMap(metadata); subsources.push({ id: "properties", default: true, @@ -1236,44 +1252,7 @@ function parseInlinePropertyMap(data: unknown): InlineSegmentPropertyMap { return normalizeInlineSegmentPropertyMap({ ids, properties }); } -export const PrecomputedIndexedSegmentPropertySource = WithParameters( - WithCredentialsProvider()( - IndexedSegmentPropertySource, - ), - IndexedSegmentPropertySourceParameters, -); - -// function parseIndexedPropertyMap(data: unknown): { -// sharding: ShardingParameters|undefined, -// properties: readonly Readonly[] -// } { -// verifyObject(data); -// const sharding = verifyObjectProperty(data, 'sharding', parseShardingParameters); -// const properties = verifyObjectProperty( -// data, 'properties', -// propertiesObj => parseArray(propertiesObj, (propertyObj): IndexedSegmentProperty => { -// const id = verifyObjectProperty(propertyObj, 'id', verifyString); -// const description = verifyOptionalObjectProperty(propertyObj, 'description', verifyString); -// const type = verifyObjectProperty(propertyObj, 'type', type => { -// if (type !== 'string') { -// throw new Error(`Invalid property type: ${JSON.stringify(type)}`); -// } -// return type; -// }); -// return {id, description, type}; -// })); -// return {sharding, properties}; -// } - -export function getSegmentPropertyMap( - chunkManager: Borrowed, - credentialsProvider: SpecialProtocolCredentialsProvider, - data: unknown, - url: string, -): SegmentPropertyMap { - chunkManager; - credentialsProvider; - url; +export function getSegmentPropertyMap(data: unknown): SegmentPropertyMap { try { const t = verifyObjectProperty(data, "@type", verifyString); if (t !== "neuroglancer_segment_properties") { @@ -1286,25 +1265,13 @@ export function getSegmentPropertyMap( "inline", parseInlinePropertyMap, ); - // const indexedProperties = verifyOptionalObjectProperty(data, 'indexed', indexedObj => { - // const {sharding, properties} = parseIndexedPropertyMap(indexedObj); - // return chunkManager.getChunkSource( - // PrecomputedIndexedSegmentPropertySource, - // {credentialsProvider, properties, parameters: {sharding, url}}); - // }); return new SegmentPropertyMap({ inlineProperties }); } catch (e) { throw new Error(`Error parsing segment property map: ${e.message}`); } } -async function getSegmentPropertyMapDataSource( - options: GetDataSourceOptions, - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - metadata: unknown, -): Promise { - options; +function getSegmentPropertyMapDataSource(metadata: unknown): DataSource { return { modelTransform: makeIdentityTransform(emptyValidCoordinateSpace), subsources: [ @@ -1312,12 +1279,7 @@ async function getSegmentPropertyMapDataSource( id: "default", default: true, subsource: { - segmentPropertyMap: getSegmentPropertyMap( - options.chunkManager, - credentialsProvider, - metadata, - url, - ), + segmentPropertyMap: getSegmentPropertyMap(metadata), }, }, ], @@ -1343,54 +1305,47 @@ export function unparseProviderUrl(url: string, parameters: any) { return url; } -export class PrecomputedDataSource extends DataSourceProvider { - get description() { - return "Precomputed file-backed data source"; +export class PrecomputedDataSource implements KvStoreBasedDataSourceProvider { + get scheme() { + return "neuroglancer-precomputed"; } - - normalizeUrl(options: NormalizeUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get expectsDirectory() { + return true; } - - convertLegacyUrl(options: ConvertLegacyUrlOptions): string { - const { url, parameters } = parseProviderUrl(options.providerUrl); - if (options.type === "mesh") { - parameters.type = "mesh"; - } - return ( - options.providerProtocol + "://" + unparseProviderUrl(url, parameters) - ); + get description() { + return "Neuroglancer Precomputed data source"; } - get(options: GetDataSourceOptions): Promise { - const { url: providerUrl, parameters } = parseProviderUrl( - options.providerUrl, + get( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + const { authorityAndPath, query, fragment } = parseUrlSuffix( + options.url.suffix, ); - return options.chunkManager.memoize.getUncounted( - { type: "precomputed:get", providerUrl, parameters }, - async (): Promise => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, + if (query) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: query parameters not supported`, + ); + } + if (authorityAndPath) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: non-empty path not supported`, + ); + } + const parameters = parseQueryStringParameters(fragment ?? ""); + const url = kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl); + return options.registry.chunkManager.memoize.getAsync( + { type: "precomputed:get", url, parameters }, + options, + async (progressOptions) => { + const { sharedKvStoreContext } = options.registry; + const metadata = await getJsonMetadata( + sharedKvStoreContext, + url, + /*required=*/ parameters.type !== "mesh", + progressOptions, ); - let metadata: any; - try { - metadata = await getJsonMetadata( - options.chunkManager, - credentialsProvider, - url, - ); - } catch (e) { - if (isNotFoundError(e)) { - if (parameters.type === "mesh") { - return await getMeshDataSource(options, credentialsProvider, url); - } - } - throw e; - } + const canonicalUrl = `${url}|${options.url.scheme}:`; verifyObject(metadata); const redirect = verifyOptionalObjectProperty( metadata, @@ -1398,52 +1353,74 @@ export class PrecomputedDataSource extends DataSourceProvider { verifyString, ); if (redirect !== undefined) { - throw new RedirectError(redirect); + return { canonicalUrl, targetUrl: redirect }; } const t = verifyOptionalObjectProperty(metadata, "@type", verifyString); + let dataSource: DataSource; switch (t) { case "neuroglancer_skeletons": - return await getSkeletonsDataSource( - options, - credentialsProvider, + dataSource = await getSkeletonsDataSource( + sharedKvStoreContext, url, + progressOptions, ); + break; case "neuroglancer_multilod_draco": case "neuroglancer_legacy_mesh": - return await getMeshDataSource(options, credentialsProvider, url); - case "neuroglancer_annotations_v1": - return await getAnnotationDataSource( - options, - credentialsProvider, + dataSource = await getMeshDataSource( + sharedKvStoreContext, url, - metadata, + progressOptions, ); - case "neuroglancer_segment_properties": - return await getSegmentPropertyMapDataSource( - options, - credentialsProvider, + break; + case "neuroglancer_annotations_v1": + dataSource = getAnnotationDataSource( + sharedKvStoreContext, url, metadata, ); + break; + case "neuroglancer_segment_properties": + dataSource = getSegmentPropertyMapDataSource(metadata); + break; case "neuroglancer_multiscale_volume": case undefined: - return await getVolumeDataSource( - options, - credentialsProvider, + dataSource = await getVolumeDataSource( + sharedKvStoreContext, url, metadata, + progressOptions, ); + break; default: throw new Error(`Invalid type: ${JSON.stringify(t)}`); } + dataSource.canonicalUrl = canonicalUrl; + return dataSource; }, ); } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, - ); +} + +export class PrecomputedLegacyUrlDataSource extends KvStoreBasedDataSourceLegacyUrlAdapter { + constructor() { + super(new PrecomputedDataSource(), "precomputed"); } + + convertLegacyUrl(options: ConvertLegacyUrlOptions): string { + const { url, parameters } = parseProviderUrl(options.providerUrl); + if (options.type === "mesh") { + parameters.type = "mesh"; + } + return options.providerScheme + "://" + unparseProviderUrl(url, parameters); + } +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["info"]), { + suffix: "neuroglancer-precomputed:", + description: "Neuroglancer Precomputed data source", + }), + ); } diff --git a/src/datasource/precomputed/index.rst b/src/datasource/precomputed/index.rst new file mode 100644 index 0000000000..1c9860a6a7 --- /dev/null +++ b/src/datasource/precomputed/index.rst @@ -0,0 +1,35 @@ +.. _precomputed-datasource: + +neuroglancer-precomputed +======================== + +The Neuroglancer Precomputed data format is specifically designed for efficient +interactive visualization and supports several kinds of data: + +.. toctree:: + :maxdepth: 1 + + Volume format + Mesh format + Skeleton format + Annotation format + Segment property format + +.. toctree:: + :hidden: + + Sharded format + +URL syntax +---------- + +- :file:`{KVSTORE-URL/}|neuroglancer-precomputed:` + +The :file:`{KVSTORE-URL/}` must refer to a directory containing an :file:`info` +metadata file. + +Auto detection +-------------- + +This data format is detected automatically based on the presence of the +:file:`info` metadata file. diff --git a/src/datasource/precomputed/json_schema/annotation.yml b/src/datasource/precomputed/json_schema/annotation.yml new file mode 100644 index 0000000000..a10be30bcb --- /dev/null +++ b/src/datasource/precomputed/json_schema/annotation.yml @@ -0,0 +1,223 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedAnnotation +title: "Precomputed annotation metadata" +type: object +properties: + "@type": + const: "neuroglancer_annotations_v1" + title: Precomputed data kind. + dimensions: + type: object + properties: + "": + type: array + items: + - type: number + - type: string + title: |- + Scale coefficient and physical unit corresponding for each dimension. + title: Coordinate space over which annotations are defined. + description: |- + The number of dimensions is called the *rank*. + lower_bound: + type: array + items: + type: number + title: |- + Lower bound (in the coordinate space given by `dimensions`). + description: |- + Length must match number of `.dimensions`. This is also the origin of the + grid used for each spatial index level. + upper_bound: + type: array + items: + type: number + title: |- + Upper bound (in the coordinate space given by `dimensions`). + description: |- + Length must match number of `.dimensions`. All annotation geometry should + be contained with the bounding box defined by `.lower_bound` and + `.upper_bound`. + annotation_type: + title: |- + Annotation geometry type. + enum: + - "point" + - "line" + - "axis_aligned_bounding_box" + - "ellipsoid" + properties: + title: Additional properties associated with each annotation. + type: array + items: + type: object + properties: + id: + type: string + title: |- + Unique identifier for the property. + description: |- + Must match the regular expression :regexp:`^[a-z][a-zA-Z0-9_]*$`. + type: + title: Property type. + oneOf: + - const: "rgb" + title: Represented as 3 uint8 values. + - const: "rgba" + title: Represented as 4 uint8 values. + - const: uint8 + - const: int8 + - const: uint16 + - const: int16 + - const: uint32 + - const: int32 + - const: float32 + description: + type: string + title: Textual description to show in the UI. + enum_values: + title: |- + Numeric values corresponding to the labels in `.enum_labels`. + description: |- + Only valid if `.type` is a numeric type (not :json:`"rgb"` or + :json:`"rgba"`). + type: array + items: + type: number + enum_labels: + title: |- + Labels corresponding to the values in `.enum_values`. + description: |- + Must be specified if, and only if, `.enum_values` is specified. If + specified, the length must match that of `.enum_values`. + type: array + items: + type: string + required: + - id + - type + relationships: + type: array + title: Related object indices. + description: |- + For each specified relationship (which usually corresponds to a specific + segmentation volume), there is an associated set of uint64 identifiers for + each annotation, and the corresponding :ref:`related object + index` can be used to + query, for a given relationship, the list of annotations that are + associated with a given uint64 identifier. + items: + type: object + properties: + id: + type: string + title: |- + Unique identifier for the relationship (displayed in the UI). + key: + type: string + title: |- + Relative path to the directory containing the :ref:`related object + index` for this + relationship. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the :ref:`related object + index` is stored + in sharded format. + required: + - id + - key + by_id: + title: |- + Parameters of the :ref:`annotation id + index`. + type: object + properties: + key: + type: string + title: |- + Relative path to the :ref:`annotation id + index`. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the :ref:`annotation id + index` is stored in sharded + format. + required: + - key + spatial: + type: array + title: Spatial index levels, from coarse to fine. + items: + type: object + properties: + key: + type: string + title: |- + Relative path to the :ref:`spatial index + level`. + grid_shape: + type: array + items: + type: integer + title: |- + Number of cells along each grid dimension for this spatial index level. + description: |- + The length must match the number of `.dimensions`. + chunk_shape: + type: array + items: + type: integer + title: |- + Number of cells along each grid dimension for this spatial index level. + description: |- + The length must match the number of `.dimensions`. + chunk_size: + type: array + items: + type: number + title: |- + Size along each dimension of each grid cell (in the coordinate space + given by `dimensions`). + description: |- + The length must match the number of `.dimensions`. + limit: + type: integer + minimum: 1 + title: |- + Maximum number of annotations per grid cell in this level of the + spatial index. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the :ref:`spatial index + level` is stored in + sharded format. + required: + - key + - grid_shape + - chunk_shape + - limit + segment_properties: + title: | + Relative path to the directory containing associated :ref:`segment + properties`. + + .. note:: + + This association does *not* apply transitively when this skeleton + dataset itself is referenced via the :ref:`precomputed + volume` `~PrecomputedVolume.mesh` metadata + property. Instead, the associated segment properties must be specified + directly in the volume metadata. + type: string +required: + - "@type" + - vertex_quantization_bits + - transform + - lod_scale_multiplier diff --git a/src/datasource/precomputed/json_schema/legacy_mesh_info.yml b/src/datasource/precomputed/json_schema/legacy_mesh_info.yml new file mode 100644 index 0000000000..3b2941e72c --- /dev/null +++ b/src/datasource/precomputed/json_schema/legacy_mesh_info.yml @@ -0,0 +1,23 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedLegacyMesh +title: "Precomputed legacy single-resolution mesh metadata" +type: object +properties: + "@type": + const: "neuroglancer_legacy_mesh" + title: Precomputed data kind. + segment_properties: + title: | + Relative path to the directory containing associated :ref:`segment + properties`. + + .. note:: + + This association does *not* apply transitively when this mesh dataset + itself is referenced via the :ref:`precomputed + volume` `~PrecomputedVolume.mesh` metadata + property. Instead, the associated segment properties must be specified + directly in the volume metadata. + type: string +required: + - "@type" diff --git a/src/datasource/precomputed/json_schema/legacy_mesh_manifest.yml b/src/datasource/precomputed/json_schema/legacy_mesh_manifest.yml new file mode 100644 index 0000000000..39a0211446 --- /dev/null +++ b/src/datasource/precomputed/json_schema/legacy_mesh_manifest.yml @@ -0,0 +1,13 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedLegacyMeshManifest +title: "Precomputed legacy single-resolution mesh manifest" +type: object +properties: + "fragments": + type: array + title: |- + List of fragment filenames. + items: + type: string +required: + - "fragments" diff --git a/src/datasource/precomputed/json_schema/multiresolution_mesh.yml b/src/datasource/precomputed/json_schema/multiresolution_mesh.yml new file mode 100644 index 0000000000..9f9fc6684f --- /dev/null +++ b/src/datasource/precomputed/json_schema/multiresolution_mesh.yml @@ -0,0 +1,56 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedMultiresolutionMesh +title: "Precomputed multi-resolution mesh metadata" +type: object +properties: + "@type": + const: "neuroglancer_multilod_draco" + title: Precomputed data kind. + vertex_quantization_bits: + type: integer + title: |- + Number of bits needed to represent each vertex position coordinate within + a mesh fragment. + description: | + Must be ``10`` or ``16``. + transform: + type: array + minItems: 12 + maxItems: 12 + items: + type: number + title: |- + 4x3 homogeneous coordinate transform matrix in row-major order from the + *stored model* coordinate space to the *model* coordinate space. + lod_scale_multiplier: + type: number + title: | + Factor by which the :literal:`lod_scales` values in each manifest are + multiplied. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the manifests and fragments are stored in + :ref:`sharded format`. If + unspecified, the manifests and fragments are stored in :ref:`unsharded + format` as separate files. + segment_properties: + title: | + Relative path to the directory containing associated :ref:`segment + properties`. + + .. note:: + + This association does *not* apply transitively when this mesh dataset + itself is referenced via the :ref:`precomputed + volume` `~PrecomputedVolume.mesh` metadata + property. Instead, the associated segment properties must be specified + directly in the volume metadata. + type: string + +required: + - "@type" + - vertex_quantization_bits + - transform + - lod_scale_multiplier diff --git a/src/datasource/precomputed/json_schema/segment_properties.yml b/src/datasource/precomputed/json_schema/segment_properties.yml new file mode 100644 index 0000000000..d32d9b06f4 --- /dev/null +++ b/src/datasource/precomputed/json_schema/segment_properties.yml @@ -0,0 +1,100 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedSegmentProperties +title: "Precomputed segment properties" +type: object +properties: + "@type": + const: "neuroglancer_segment_properties" + title: Precomputed data kind. + "inline": + title: Inline properties and their values. + type: object + properties: + ids: + title: Segment IDs for which inline property values are specified. + description: |- + IDs are specified as base-10 strings. + type: array + items: + type: string + properties: + type: object + title: "Supported inline properties." + properties: + id: + type: string + title: String identifier to display in the UI. + description: |- + Ignored if `.type` is ``"label"`` or ``"description"``. + type: + enum: + - "label" + - "description" + - "string" + - "tags" + - "number" + title: Property type. + description: |- + At most one property may have type ``"label"`` (which is displayed in + the UI next to the segment ID), at most one property may have type + ``"description"``, and at most one property may have type ``"tags"``. + description: + type: string + title: Description of the property to display to the user. + description: |- + Must not be present if `.type` is ``"tags"``. + tags: + type: array + items: + type: string + title: List of valid tag values. + description: |- + Must be specified if, and only if, `.type` is ``"tags"``. The + specified tags must all be distinct, must not contain spaces, and do + not include the initial ``"#"`` character. Tags are matched + case-insensitively. + tag_descriptions: + type: array + items: + type: string + title: |- + Longer description for each of the tags. + description: |- + May be present if `.type` is ``"tags"``, otherwise must not be + specified. The length must match the length of `.tags`. + data_type: + title: |- + Data type for numerical properties. + description: |- + Must be present if, and only if, `.type` is ``"number"``. + enum: + - uint8 + - int8 + - uint16 + - int16 + - uint32 + - int32 + - float32 + values: + title: |- + Property value for each ID in `.ids`. + type: array + description: |- + - If `.type` is equal to ``"label"``, ``"description"``, or + ``"string"``, each element must be a string. + + - If `.type` is equal to ``"number"``, each element must be a + number that will be converted to the specified `.data_type`. + + - If `.type` is equal to ``"tags"``, each element must be an array + of integers (in increasing order), where each number specifies a + 0-based index into the ``"tags"`` array. + required: + - id + - type + - values + required: + - ids + - properties +required: + - "@type" diff --git a/src/datasource/precomputed/json_schema/sharding.yml b/src/datasource/precomputed/json_schema/sharding.yml new file mode 100644 index 0000000000..1bb5537555 --- /dev/null +++ b/src/datasource/precomputed/json_schema/sharding.yml @@ -0,0 +1,66 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedSharding +title: "Precomputed sharded format parameters" +type: object +properties: + "@type": + const: neuroglancer_uint64_sharded_v1 + preshift_bits: + type: integer + title: |- + Number of low-order bits of the chunk ID that do not contribute to the + hashed chunk ID. + minimum: 0 + maximum: 64 + hash: + enum: + - identity + - murmurhash3_x86_128 + title: |- + Specifies the hash function used to map chunk IDs to shards. + minishard_bits: + type: integer + title: |- + Number of bits of the hashed chunk ID that determine the minishard + number. + description: |- + The number of minishards within each shard is equal to + :math:`2^{\mathrm{minishard\_bits}}`. The minishard number is equal + to bits :python:`[0, minishard_bits)` of the hashed chunk id. + minimum: 0 + maximum: 64 + shard_bits: + type: integer + title: |- + Number of bits of the hashed chunk ID that determine the shard number. + description: |- + The number of shards is equal to :math:`2^{\mathrm{shard\_bits}}`. + The shard number is equal to bits :python:`[minishard_bits, + minishard_bits+shard_bits)` of the hashed chunk ID. + minimum: 0 + maximum: 64 + minishard_index_encoding: + title: |- + Specifies the encoding of the minishard index. + description: |- + Normally ``"gzip"`` is a good choice. + enum: + - raw + - gzip + data_encoding: + title: |- + Specifies the encoding of the data chunks. + description: |- + Normally ``"gzip"`` is a good choice, unless the data is expected to + already be fully compressed. + enum: + - raw + - gzip +required: + - "@type" + - preshift_bits + - hash + - minishard_bits + - shard_bits + - minishard_index_encoding + - data_encoding diff --git a/src/datasource/precomputed/json_schema/skeleton.yml b/src/datasource/precomputed/json_schema/skeleton.yml new file mode 100644 index 0000000000..c2715014c5 --- /dev/null +++ b/src/datasource/precomputed/json_schema/skeleton.yml @@ -0,0 +1,71 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedSkeleton +title: "Precomputed skeleton metadata" +type: object +properties: + "@type": + const: "neuroglancer_skeletons" + title: Precomputed data kind. + transform: + type: array + minItems: 12 + maxItems: 12 + items: + type: number + title: |- + 4x3 homogeneous coordinate transform matrix in row-major order from the + *stored model* coordinate space to the *model* coordinate space. The + "stored model" coordinate space is arbitrary. The "model" coordinate space + should be in nanometers. + vertex_attributes: + type: array + title: Additional per-vertex attributes. + items: + type: object + properties: + id: + type: string + title: Unique identifier of the attribute. + data_type: + enum: + - "float32" + - "uint8" + - "int8" + - "uint16" + - "int16" + - "uint32" + - "int32" + title: Attribute data type. + num_components: + type: integer + minimum: 1 + title: Number of components. + description: |- + If `.num_components` is greater than 1, the attribute is a vector. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the skeletons are stored in :ref:`sharded + format`. If unspecified, the + skeletons are stored in :ref:`unsharded + format` as separate files. + segment_properties: + title: | + Relative path to the directory containing associated :ref:`segment + properties`. + + .. note:: + + This association does *not* apply transitively when this skeleton + dataset itself is referenced via the :ref:`precomputed + volume` `~PrecomputedVolume.mesh` metadata + property. Instead, the associated segment properties must be specified + directly in the volume metadata. + type: string + +required: + - "@type" + - vertex_quantization_bits + - transform + - lod_scale_multiplier diff --git a/src/datasource/precomputed/json_schema/volume.yml b/src/datasource/precomputed/json_schema/volume.yml new file mode 100644 index 0000000000..b6fe91f8be --- /dev/null +++ b/src/datasource/precomputed/json_schema/volume.yml @@ -0,0 +1,335 @@ +$schema: http://json-schema.org/draft-07/schema# +$id: PrecomputedVolume +title: "Precomputed volume metadata" +type: object +properties: + "@type": + const: "neuroglancer_multiscale_volume" + title: Precomputed data kind. + description: Optional but strongly recommended for new data. + "type": + title: Specifies how to interpret the volume. + oneOf: + - const: image + title: Generic image volume. + description: |- + Displays as an :ref:`image layer` by default. + - const: segmentation + title: Discrete object label volume. + description: |- + Displays as a :ref:`segmentation layer` by default. + data_type: + enum: + - uint8 + - int8 + - uint16 + - int16 + - uint32 + - int32 + - uint64 + - float32 + title: Data type of the volume. + num_channels: + type: integer + minimum: 1 + title: Number of channels. + description: Must be 1 if `.type` is ``"segmentation"``. + scales: + type: array + title: Metadata for each resolution of the data. + minItems: 1 + items: + type: object + properties: + key: + type: string + title: Relative path to the directory containing the chunk data for this scale. + examples: + - "8_8_8" + - "../other_volume/8_8_8" + size: + type: array + minItems: 3 + maxItems: 3 + items: + type: integer + minimum: 0 + title: |- + Dimensions of the volume in voxels (XYZ order). + examples: + - [500, 500, 500] + voxel_offset: + type: array + minItems: 3 + maxItems: 3 + items: + type: integer + title: |- + Origin of the volume in voxels (XYZ order). + chunk_sizes: + type: array + minItems: 1 + items: + type: array + minItems: 3 + maxItems: 3 + items: + type: integer + minimum: 1 + title: Chunk dimensions (XYZ order). + description: |- + Typically just a single chunk shape is specified, but more than one + chunk shape can be specified to optimize different read access + patterns. For each chunk shape specified, a separate copy of the + data must be stored. + examples: + - [[64, 64, 64]] + - [[512, 512, 1], [512, 1, 512], [1, 512, 512]] + resolution: + type: array + minItems: 3 + maxItems: 3 + items: + type: number + title: |- + Voxel size in nanometers (XYZ order). + description: | + .. note:: Units other than meters cannot be represented. + encoding: + title: Encoding of stored chunks. + oneOf: + - const: raw + title: | + :ref:`precomputed-volume-encoding-raw` + - const: jpeg + title: | + :ref:`precomputed-volume-encoding-jpeg` + - const: compressed_segmentation + title: | + :ref:`precomputed-volume-encoding-compressed-segmentation` + - const: png + title: | + :ref:`precomputed-volume-encoding-png` + - const: compresso + title: | + :ref:`precomputed-volume-encoding-compresso` + - const: jxl + title: | + :ref:`precomputed-volume-encoding-jxl` + jpeg_quality: + type: integer + minimum: 0 + maximum: 100 + title: |- + JPEG encoding quality when writing chunks. + description: |- + Only valid if `.encoding` is ``"jpeg"``. The quality is specified + using the IJG (Independent JPEG Group) [0, 100] recommended scale, + with 0 having the worst quality (smallest file size) and 100 the + best quality (largest file size). + + .. note:: + + This option only affects writing and is ignored by Neuroglancer. + png_level: + type: integer + minimum: 0 + maximum: 9 + title: |- + PNG compression level when writing chunks. + description: |- + Only valid if `.encoding` is ``"png"``. Specifies the zlib + compression level between [0, 9], where 0 is uncompressed, with 1 + having the fastest compression (largest file size), and 9 the + slowest compression (smallest file size). + + .. note:: + + This option only affects writing and is ignored by Neuroglancer. + compressed_segmentation_block_size: + type: array + minItems: 3 + maxItems: 3 + items: + type: number + minimum: 1 + title: |- + Block size for compressed segmentation encoding (XYZ order). + description: |- + Must be specified if, and only if, `.encoding` is ``"compressed_segmentation"``. + sharding: + $ref: PrecomputedSharding + title: Sharding parameters. + description: |- + If specified, indicates that the chunks are stored in :ref:`sharded + format`. If unspecified, chunks + are stored in :ref:`unsharded + format`. + hidden: + type: boolean + title: Exclude scale from rendering. + default: false + + required: + - key + - size + - chunk_size + - resolution + - encoding + mesh: + type: string + title: Relative path to associated :ref:`object meshes`. + description: | + Only valid if `.type` is ``"segmentation"``. + skeletons: + type: string + title: Relative path to associated :ref:`object skeletons`. + description: | + Only valid if `.type` is ``"segmentation"``. + segment_properties: + type: string + title: Relative path to associated :ref:`segment properties`. + description: | + Only valid if `.type` is ``"segmentation"``. + +required: + - "type" + - "data_type" + - "num_channels" +examples: + - { + "data_type": "uint8", + "num_channels": 1, + "scales": + [ + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "8_8_8", + "resolution": [8, 8, 8], + "size": [6446, 6643, 8090], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "16_16_16", + "resolution": [16, 16, 16], + "size": [3223, 3321, 4045], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "32_32_32", + "resolution": [32, 32, 32], + "size": [1611, 1660, 2022], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "64_64_64", + "resolution": [64, 64, 64], + "size": [805, 830, 1011], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "128_128_128", + "resolution": [128, 128, 128], + "size": [402, 415, 505], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "256_256_256", + "resolution": [256, 256, 256], + "size": [201, 207, 252], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "encoding": "jpeg", + "key": "512_512_512", + "resolution": [512, 512, 512], + "size": [100, 103, 126], + "voxel_offset": [0, 0, 0], + }, + ], + "type": "image", + } + - { + "data_type": "uint64", + "mesh": "mesh", + "num_channels": 1, + "scales": + [ + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "8_8_8", + "resolution": [8, 8, 8], + "size": [6446, 6643, 8090], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "16_16_16", + "resolution": [16, 16, 16], + "size": [3223, 3321, 4045], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "32_32_32", + "resolution": [32, 32, 32], + "size": [1611, 1660, 2022], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "64_64_64", + "resolution": [64, 64, 64], + "size": [805, 830, 1011], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "128_128_128", + "resolution": [128, 128, 128], + "size": [402, 415, 505], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "256_256_256", + "resolution": [256, 256, 256], + "size": [201, 207, 252], + "voxel_offset": [0, 0, 0], + }, + { + "chunk_sizes": [[64, 64, 64]], + "compressed_segmentation_block_size": [8, 8, 8], + "encoding": "compressed_segmentation", + "key": "512_512_512", + "resolution": [512, 512, 512], + "size": [100, 103, 126], + "voxel_offset": [0, 0, 0], + }, + ], + "type": "segmentation", + } diff --git a/src/datasource/precomputed/mesh.rst b/src/datasource/precomputed/mesh.rst new file mode 100644 index 0000000000..fdcda8b29f --- /dev/null +++ b/src/datasource/precomputed/mesh.rst @@ -0,0 +1,227 @@ +.. _precomputed-mesh-format: + +Precomputed mesh format +======================= + +The precomputed mesh format maps uint64 keys to corresponding 3-d triangulated meshes. + +Commonly, these meshes represent the surfaces of the segmented objects in a 3-d +segmentation volume. + +The are two variants of the mesh format: + +- :ref:`precomputed-mesh-format-multiresolution` + (preferred even for single-resolution meshes) +- :ref:`precomputed-mesh-format-legacy` + +.. note:: + + A mesh may be associated with a :ref:`precomputed segmentation + volume` via the + :json:schema:`~PrecomputedVolume.mesh` metadata property. + +.. _precomputed-mesh-format-multiresolution: + +Multi-resolution mesh format +---------------------------- + +Multi-resolution meshes are represented as a directory tree containing the +following data: + +- :file:`info` file in JSON format specifying the + :json:schema:`metadata`. + +- For each segment ID for which there is a mesh representation: + + - a :ref:`manifest file` + that specifies the levels of detail and octree decomposition for the object; + - a :ref:`mesh fragment data + file` specifying an + encoded mesh representation corresponding to each octree node. + +The actual storage of the manifest and mesh fragment data depends on whether the +:ref:`unsharded` or +:ref:`sharded` variant of the +format is used. + +:file:`info` metadata file +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. json:schema:: PrecomputedMultiresolutionMesh + +.. _precomputed-mesh-format-multiresolution-manifest: + +Encoded manifest format +~~~~~~~~~~~~~~~~~~~~~~~ + +For each segment ID for which there is a mesh representation, there is an +encoded *manifest* in the following format: + +- ``chunk_shape``: 3x float32le, specifies the ``x``, ``y``, and ``z`` extents of + finest octree node in the "stored model" coordinate space. +- ``grid_origin``: 3x float32le, specifies the ``x``, ``y``, and ``z`` origin of + the octree decomposition in the "stored model" coordinate space. +- ``num_lods``: uint32le, specifies the number of levels of detail. +- ``lod_scales``: ``num_lods`` float32le, specifies the scale in "stored model" spatial units + corresponding to each level of detail. Each scale value is multiplied by the + :json:schema:`~PrecomputedMultiresolutionMesh.lod_scale_multiplier` metadata property. +- ``vertex_offsets``: ``num_lods*3`` float32le, as a C order ``[num_lods, 3]`` + array specifying an offset (in the "stored model" coordinate space) to add to + vertex positions for each level of detail. +- ``num_fragments_per_lod``: ``num_lods`` uint32le, specifies the number of + fragments (octree nodes) for each level of detail. +- For each ``lod`` in the range ``[0, num_lods)``: + + - ``fragment_positions``: ``num_fragments_per_lod[lod]*3`` uint32le, C order + ``[3, numFragments_per_lod[lod]]`` array specifying the ``x``, ``y``, and + ``z`` coordinates of the octree nodes for the given ``lod``. The node + positions must be in ``x``, ``y``, ``z`` Z-curve order. The node corresponds + to the axis-aligned bounding box within the "stored model" coordinate space + with an origin of: ``grid_origin + [x, y, z] * chunk_shape * (2**lod)`` and + a shape of ``chunk_shape * (2**lod)``. + - ``fragment_offsets``: ``num_fragments_per_lod[lod]`` uint32le, specifies the + size in bytes of the encoded mesh fragment in the [mesh fragment data + file](#multi-resolution-mesh-fragment-data-file-format) corresponding to + each octree node in the ``fragment_positions`` array. The starting offset of + the encoded mesh data corresponding to a given octree node is equal to the + sum of all prior ``fragment_offsets`` values. + +.. _precomputed-mesh-format-multiresolution-fragment-data: + +Encoded mesh fragment data +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The mesh fragment data files consist of the concatenation of the encoded mesh +data for all octree nodes specified in the manifest file, in the same order the +nodes are specified in the manifest, starting with ``lod`` 0. Each mesh fragment +is a `Draco `__-encoded triangular mesh with a +3-component integer vertex position attribute. Each position component ``j`` +must be a value ``x`` in the range ``[0, 2**vertex_quantization_bits)``, which +corresponds to a "stored model" coordinate of:: + + grid_origin[j] + + vertex_offsets[lod,j] + + chunk_shape[j] * (2**lod) * (fragmentPosition[j] + + x / ((2**vertex_quantization_bits)-1)) + +.. note:: + + The built-in Draco attribute quantization is not supported. + +Each mesh fragment for ``lod > 0`` must be partitioned by a ``2x2x2`` grid such +that no triangle crosses a grid boundary (but may be incident to a grid +boundary). + +.. _precomputed-mesh-format-multiresolution-unsharded: + +Unsharded format +~~~~~~~~~~~~~~~~~ + +In the *unsharded* variant of the format, the manifest of each object is stored +as a separate file under the name :file:`{}.index`, and the mesh +fragment data is stored under the name :file:`{}`, where +:file:`{}` is the base-10 string representation of the segment ID. +These files are stored in the same directory as the :file:`info` metadata file. + +.. _precomputed-mesh-format-multiresolution-sharded: + +Sharded variant +~~~~~~~~~~~~~~~ + +In the *sharded* variant of the format, the manifest of each object is stored in +:ref:`sharded format` using the segment ID as the +key. + +The shard data is stored in the same directory as the :file:`info` metadata +file. The mesh fragment data for each object is located immediately before the +encoded manifest in the same shard data file. The starting offset within that +shard data file is not specified explicitly but may be computed from the +starting offset of the manifest file and the sum of the mesh fragment sizes +specified in the manifest. + +.. note:: + + From the perspective of the sharded format as a plain key-value store, the + encoded manifests are the values and the mesh fragment data is effectively + stored in what would normally be considered unused space. + +.. note:: + + The mesh fragment data is always stored without additional compression, + regardless of the :json:schema:`~PrecomputedSharding.data_encoding` + parameter. + +.. _precomputed-mesh-format-legacy: + +Legacy single-resolution mesh format +------------------------------------ + +In addition to the multi-resolution mesh format, an older single-resolution mesh +format is also supported. + +This format consists of a directory containing: + +- an (optional) :ref:`precomputed-mesh-format-legacy-metadata` in JSON-format, +- :ref:`manifest files` in JSON format + named :file:`{segment-id}:0`, where :file:`{segment-id}` is the base-10 string + representation of the uint64 segment ID; +- :ref:`mesh fragment files` with + arbitrary names specified in the manifest files. + +.. note:: + + Unlike the multi-resolution format, this legacy mesh format does not support + a sharded storage representation. + +.. _precomputed-mesh-format-legacy-metadata: + +:file:`info` metadata file +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The :file:`info` metadata file, if present, must be in JSON format with the +following schema: + +.. json:schema:: PrecomputedLegacyMesh + +.. note:: + + The :file:`info` metadata file is optional but strongly recommended. If there + is no :file:`info` metadata file, the mesh format cannot be auto-detected and + instead must be specified by an explicit data source URL of the form: + :file:`{KVSTORE-URL/}|neuroglancer-precomputed:#type=mesh`. + +.. _precomputed-mesh-format-legacy-manifest: + +Manifest files +~~~~~~~~~~~~~~ + +The :file:`{segment-id}:0` manifest files are in JSON format with the following +schema: + +.. json:schema:: PrecomputedLegacyMeshManifest + +In the simplest case, each object mesh may be stored as a single fragment, +meaning each manifest specifies just a single mesh fragment filename. In +general, though, the mesh may be split into one or more separate fragments (e.g. +corresponding to chunks of the volume). + +.. _precomputed-mesh-format-legacy-fragment: + +Mesh fragment files +~~~~~~~~~~~~~~~~~~~ + +Each fragment file is specified in the following binary format: + +- The file begins with a little-endian 32-bit unsigned integer ``num_vertices`` + specifying the number of vertices. +- The ``[x, y, z]`` vertex positions (as nanometer offsets within the global + coordinate frame) are stored as little-endian single precision/binary32 + floating point values starting at an offset of ``4`` bytes from the start of + the file (immediately after the ``num_vertices`` value) and ending at a byte + offset of ``4 + 4 * 3 * num_vertices``. The x, y, and z components of the + vertex positions are interleaved, i.e. ``[x0, y0, z0, x1, y1, z1, ...]``. +- The number of triangles is inferred as the number of remaining bytes in the + file after the vertex position data divided by 12 (the number of remaining + bytes must be a multiple of 12). The triangles are specified as an array of + interleaved triplets ``[a, b, c]`` of vertex indices. The vertex indices are + encoded as little-endian 32-bit unsigned integers. diff --git a/src/datasource/precomputed/register_default.ts b/src/datasource/precomputed/register_default.ts index ae5ed2d680..154b42bb80 100644 --- a/src/datasource/precomputed/register_default.ts +++ b/src/datasource/precomputed/register_default.ts @@ -14,7 +14,17 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { PrecomputedDataSource } from "#src/datasource/precomputed/frontend.js"; +import { + dataSourceAutoDetectRegistry, + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { + PrecomputedDataSource, + PrecomputedLegacyUrlDataSource, + registerAutoDetect, +} from "#src/datasource/precomputed/frontend.js"; -registerProvider("precomputed", () => new PrecomputedDataSource()); +registerKvStoreBasedDataProvider(new PrecomputedDataSource()); +registerProvider(new PrecomputedLegacyUrlDataSource()); +registerAutoDetect(dataSourceAutoDetectRegistry); diff --git a/src/datasource/precomputed/segment_properties.rst b/src/datasource/precomputed/segment_properties.rst new file mode 100644 index 0000000000..c411666c2b --- /dev/null +++ b/src/datasource/precomputed/segment_properties.rst @@ -0,0 +1,19 @@ +.. _precomputed-segment-properties-format: + +Neuroglancer Precomputed Segment Properties Format +================================================== + +A collection of property values may be associated with uint64 segment IDs +(usually corresponding to a segmentation volume, meshes, and/or skeletons). + +Currently only *inline* properties are supported, where the complete list of segment IDs and +associated property values is stored inline within the single :file:`info` JSON file. + +The properties are represented by a directory containing a single :file:`info` JSON file. + +:file:`info` metadata file +-------------------------- + +The :file:`info` file is JSON-formt text file, with the following schema: + +.. json:schema:: PrecomputedSegmentProperties diff --git a/src/datasource/precomputed/sharded.rst b/src/datasource/precomputed/sharded.rst new file mode 100644 index 0000000000..072014261e --- /dev/null +++ b/src/datasource/precomputed/sharded.rst @@ -0,0 +1,127 @@ +.. _precomputed-sharded-format: + +Neuroglancer Precomputed Sharded Format +======================================= + +The precomputed sharded format is logically a key-value store that maps 8-byte (uint64) +keys to arbitrary byte sequence values. + +It packs any number of key/value pairs (called *chunks*) into a fixed number of +larger *shard* files. Compared to storing each key in a separate file, it can +reduce space overhead and storage and improve write efficiency on storage +systems with high per-file overhead, as is common in many distributed storage +systems including cloud object stores. There are several downsides to the +sharded format, however: + +- It requires greater complexity in the generation pipeline. +- It is not possible to re-write the data for individual chunks; the entire + shard must be re-written. +- There is somewhat higher read latency due to the need to retrieve additional + index information before retrieving the actual chunk data, although this + latency is partially mitigated by client-side caching of the index data in + Neuroglancer. + +The sharded format uses a two-level index hierarchy: + +- There are a fixed number of shards, and a fixed number of minishards within + each shard. +- Each chunk, identified by a uint64 identifier, is mapped via a hash function + to a particular shard and minishard. In the case of meshes and skeletons, the + chunk identifier is simply the segment + ID. In the case of volumetric and annotation data, the chunk identifier is the + :ref:`compressed Morton code`. +- A fixed size :ref:`shard index` stored + at the start of each shard file specifies for each minishard the start and end + offsets within the shard file of the corresponding *minishard index*. +- The variable-size :ref:`shard + index` specifies the list of chunk + ids present in the minishard and the corresponding start and end offsets of + the data within the shard file. + +.. note:: + + The sharded format requires that the underlying key-value store supports + :ref:`byte range reads`. + +The sharded format consists of the :json:schema:`sharding metadata +parameters`, which are embedded in the parent format +:file:`info` metadata file, and a directory containing the :ref:`shard data +files`. + +Sharding metadata +----------------- + +.. json:schema:: PrecomputedSharding + +.. _precomputed-sharded-shard-data-files: + +Shard data files +---------------- + +For each shard number in the range ``[0, 2**shard_bits)``, there is a +:file:`{}.shard` file, where :file:`{}` is the lowercase base-16 +shard number zero padded to ``ceil(shard_bits/4)`` digits. + +.. note:: + + There was an earlier (obselete) version of the sharded format, which also + used the same :json:`"neuroglancer_uint64_sharded_v1"` identifier. The + earlier format differed only in that there was a separate + :file:`{}.index` file (containing the *shard index*) and a + :file:`{}.data` file (containing the remaining data) in place of the + single :file:`{}.shard` file of the current format; the + :file:`{}.shard` file is equivalent to the concatenation of the + :file:`{}.index` and :file:`{}.data` files of the earlier + version. + +.. _precomputed-sharded-format-shard-index: + +Shard index format +------------------ + +The first ``2**minishard_bits * 16`` bytes of each shard file is the *shard +index* consisting of ``2**minishard_bits`` 16-byte entries of the form: + +- ``start_offset``: uint64le, specifies the inclusive start byte offset of the + :ref:`minishard index` in the + shard file. +- ``end_offset``: uint64le, specifies the exclusive end byte offset of the + :ref:`minishard index` in the + shard file. + +Both the ``start_offset`` and ``end_offset`` are relative to the end of the +*shard index*, i.e. ``shard_index_end = 2**minishard_bits * 16`` bytes. + +That is, the encoded :ref:`minishard +index` for a given minishard is +stored in the byte range ``[shard_index_end + start_offset, shard_index_end + +end_offset)`` of the shard file. A zero-length byte range indicates that there +are no chunk IDs in the minishard. + +.. _precomputed-sharded-format-minishard-index: + +Minishard index format +---------------------- + +The *minishard index* stored in the shard file is encoded according to the +:json:schema:`~PrecomputedSharding.minishard_index_encoding` metadata value. + +The decoded *minishard index* is a binary string of ``24*n`` bytes, specifying a +contiguous C-order ``array`` of ``[3, n]`` uint64le values. + +- Values ``array[0, 0], ..., array[0, n-1]`` specify the chunk IDs in the + minishard, and are delta encoded, such that ``array[0, 0]`` is equal to the ID + of the first chunk, and the ID of chunk ``i`` is equal to the sum of + ``array[0, 0], ..., array[0, i]``. + +- The size of the data for chunk ``i`` is stored as ``array[2, i]``. Values + ``array[1, 0], ..., array[1, n-1]`` specify the starting offsets in the shard + file of the data corresponding to each chunk, and are also delta encoded + relative to the *end* of the prior chunk, such that the starting offset of the + first chunk is equal to ``shard_index_end + array[1, 0]``, and the starting + offset of chunk ``i`` is the sum of ``shard_index_end + array[1, 0], ..., + array[1, i]`` and ``array[2, 0], ..., array[2, i-1]``. + +The start and size values in the minishard index specify the location in the +shard file of the chunk data, which is encoded according to the +:json:schema:`~PrecomputedSharding.data_encoding` metadata value. diff --git a/src/datasource/precomputed/sharded.ts b/src/datasource/precomputed/sharded.ts new file mode 100644 index 0000000000..55d9bc8b71 --- /dev/null +++ b/src/datasource/precomputed/sharded.ts @@ -0,0 +1,312 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import { + DataEncoding, + ShardingHashFunction, + type ShardingParameters, +} from "#src/datasource/precomputed/base.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + ByteRange, + DriverReadOptions, + FileHandle, + KvStoreWithPath, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { KvStoreFileHandle, readFileHandle } from "#src/kvstore/index.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { convertEndian64, Endianness } from "#src/util/endian.js"; +import { murmurHash3_x86_128Hash64Bits_Bigint } from "#src/util/hash.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const shardingHashFunctions: Map< + ShardingHashFunction, + (input: bigint) => bigint +> = new Map([ + [ + ShardingHashFunction.MURMURHASH3_X86_128, + (input) => murmurHash3_x86_128Hash64Bits_Bigint(/*seed=*/ 0, input), + ], + [ShardingHashFunction.IDENTITY, (input) => input], +]); + +export interface ShardInfo { + shardPath: string; + offset: number; +} + +interface DecodedMinishardIndex { + data: BigUint64Array; + shardPath: string; +} + +type MinishardIndexCache = SimpleAsyncCache< + bigint, + DecodedMinishardIndex | undefined +>; + +function decodeFileHandle(handle: FileHandle, encoding: DataEncoding) { + if (encoding === DataEncoding.GZIP) { + handle = new GzipFileHandle(handle, "gzip"); + } + return handle; +} + +function makeMinishardIndexCache( + chunkManager: ChunkManager, + base: KvStoreWithPath, + sharding: ShardingParameters, +): MinishardIndexCache { + return new SimpleAsyncCache(chunkManager.addRef(), { + encodeKey: (key) => key.toString(), + get: async ( + shardAndMinishard: bigint, + progressOptions: Partial, + ) => { + const minishard = + shardAndMinishard & ((1n << BigInt(sharding.minishardBits)) - 1n); + const shard = + ((1n << BigInt(sharding.shardBits)) - 1n) & + (shardAndMinishard >> BigInt(sharding.minishardBits)); + const shardPath = + base.path + + shard.toString(16).padStart(Math.ceil(sharding.shardBits / 4), "0") + + ".shard"; + + const shardFileHandle = new KvStoreFileHandle(base.store, shardPath); + + // Retrive minishard index start/end offsets. + const shardIndexSize = BigInt(16) << BigInt(sharding.minishardBits); + + // Multiply minishard by 16. + const shardIndexStart = minishard << 4n; + const response = await readFileHandle(shardFileHandle, { + ...progressOptions, + byteRange: { offset: Number(shardIndexStart), length: 16 }, + strictByteRange: true, + }); + if (response === undefined) { + return { data: undefined, size: 0 }; + } + const shardIndexResponse = await response.response.arrayBuffer(); + const shardIndexDv = new DataView(shardIndexResponse); + let minishardStartOffset = shardIndexDv.getBigUint64( + 0, + /*littleEndian=*/ true, + ); + let minishardEndOffset = shardIndexDv.getBigUint64( + 8, + /*littleEndian=*/ true, + ); + if (minishardStartOffset === minishardEndOffset) { + return { data: undefined, size: 0 }; + } + // The start/end offsets in the shard index are relative to the end of the shard + // index. + minishardStartOffset += shardIndexSize; + minishardEndOffset += shardIndexSize; + + const minishardIndexBuffer = await ( + await readFileHandle( + decodeFileHandle( + new FileByteRangeHandle(shardFileHandle, { + offset: Number(minishardStartOffset), + length: Number(minishardEndOffset - minishardStartOffset), + }), + sharding.minishardIndexEncoding, + ), + { + ...progressOptions, + strictByteRange: true, + throwIfMissing: true, + }, + ) + ).response.arrayBuffer(); + if (minishardIndexBuffer.byteLength % 24 !== 0) { + throw new Error( + `Invalid minishard index length: ${minishardIndexBuffer.byteLength}`, + ); + } + const minishardIndex = new BigUint64Array(minishardIndexBuffer); + convertEndian64(minishardIndex, Endianness.LITTLE); + + const minishardIndexSize = minishardIndex.byteLength / 24; + let prevEntryKey = 0n; + // Offsets in the minishard index are relative to the end of the shard index. + let prevStart = shardIndexSize; + for (let i = 0; i < minishardIndexSize; ++i) { + const entryKey = prevEntryKey + minishardIndex[i]; + prevEntryKey = minishardIndex[i] = entryKey; + const start = prevStart + minishardIndex[minishardIndexSize + i]; + minishardIndex[minishardIndexSize + i] = start; + const size = minishardIndex[2 * minishardIndexSize + i]; + const end = start + size; + prevStart = end; + minishardIndex[2 * minishardIndexSize + i] = end; + } + return { + data: { data: minishardIndex, shardPath }, + size: minishardIndex.byteLength, + }; + }, + }); +} + +function findMinishardEntry( + minishardIndex: DecodedMinishardIndex, + key: bigint, +): ByteRange | undefined { + const minishardIndexData = minishardIndex.data; + const minishardIndexSize = minishardIndexData.length / 3; + for (let i = 0; i < minishardIndexSize; ++i) { + if (minishardIndexData[i] !== key) { + continue; + } + const startOffset = minishardIndexData[minishardIndexSize + i]; + const endOffset = minishardIndexData[2 * minishardIndexSize + i]; + + return { + offset: Number(startOffset), + length: Number(endOffset - startOffset), + }; + } + return undefined; +} + +export class ShardedKvStore + extends RefCounted + implements ReadableKvStore +{ + private minishardIndexCache: Owned; + + constructor( + chunkManager: ChunkManager, + private base: KvStoreWithPath, + private sharding: ShardingParameters, + ) { + super(); + this.minishardIndexCache = this.registerDisposer( + makeMinishardIndexCache(chunkManager, base, sharding), + ); + } + + getUrl(key: bigint): string { + return `chunk ${key} in ${this.base.store.getUrl(this.base.path)}`; + } + + async findKey( + key: bigint, + progressOptions: Partial, + ): Promise<{ minishardEntry: ByteRange; shardInfo: ShardInfo } | undefined> { + const { sharding } = this; + const hashFunction = shardingHashFunctions.get(sharding.hash)!; + const hashCode = hashFunction(key >> BigInt(sharding.preshiftBits)); + const shardAndMinishard = + hashCode & + ((1n << BigInt(sharding.minishardBits + sharding.shardBits)) - 1n); + const minishardIndex = await this.minishardIndexCache.get( + shardAndMinishard, + progressOptions, + ); + if (minishardIndex === undefined) return undefined; + const minishardEntry = findMinishardEntry(minishardIndex, key); + if (minishardEntry === undefined) return undefined; + return { + minishardEntry, + shardInfo: { + shardPath: minishardIndex.shardPath, + offset: minishardEntry.offset, + }, + }; + } + + async readWithShardInfo( + key: bigint, + options: DriverReadOptions, + ): Promise< + | { + response: ReadResponse; + shardInfo: ShardInfo; + } + | undefined + > { + const { sharding } = this; + const findResult = await this.findKey(key, options); + if (findResult === undefined) return undefined; + const { minishardEntry, shardInfo } = findResult; + return { + response: (await decodeFileHandle( + new FileByteRangeHandle( + new KvStoreFileHandle(this.base.store, shardInfo.shardPath), + minishardEntry, + ), + sharding.dataEncoding, + ).read(options))!, + shardInfo, + }; + } + + async stat( + key: bigint, + options: StatOptions, + ): Promise { + const findResult = await this.findKey(key, options); + if (findResult === undefined) return undefined; + const { sharding } = this; + if (sharding.dataEncoding !== DataEncoding.RAW) { + return { totalSize: undefined }; + } else { + return { totalSize: findResult.minishardEntry.length }; + } + } + + async read( + key: bigint, + options: DriverReadOptions, + ): Promise { + const response = await this.readWithShardInfo(key, options); + if (response === undefined) return undefined; + return response.response; + } + + get supportsOffsetReads() { + return this.sharding.dataEncoding === DataEncoding.RAW; + } + get supportsSuffixReads() { + return this.sharding.dataEncoding === DataEncoding.RAW; + } +} + +export function getShardedKvStoreIfApplicable( + chunkSource: RefCounted & { + chunkManager: ChunkManager; + }, + base: KvStoreWithPath, + sharding: ShardingParameters | undefined, +) { + if (sharding === undefined) return undefined; + return chunkSource.registerDisposer( + new ShardedKvStore(chunkSource.chunkManager, base, sharding), + ); +} diff --git a/src/datasource/precomputed/skeleton.rst b/src/datasource/precomputed/skeleton.rst new file mode 100644 index 0000000000..1c6daf56fc --- /dev/null +++ b/src/datasource/precomputed/skeleton.rst @@ -0,0 +1,64 @@ +.. _precomputed-skeleton-format: + +Skeleton format +=============== + +A skeleton representation of some or all segmented objects may be specified as a directory tree +consisting of the following files: + +- :file:`info` file in JSON format specifying the + :json:schema:`metadata`. +- For each segment ID for which there is a skeleton representation, a segment + data file specifying the :ref:`encoded + skeleton` for a single segment. + +The actual storage of the manifest and mesh fragment data depends on whether the +:ref:`unsharded` or +:ref:`sharded` format is used. + +:file:`info` metadata file +-------------------------- + +The :file:`info` file is a JSON-format text file with the following schema: + +.. json:schema:: PrecomputedSkeleton + +.. _precomputed-skeleton-format-encoding: + +Encoded skeleton file format +---------------------------- + +The skeleton representation for a single segment ID is a binary file with the +following format: + +- ``num_vertices``: uint32le, specifies the number of vertices. +- ``num_edges``: uint32le, specifies the number of edges. +- ``vertex_positions``: ``3*num_vertices`` float32le, as a C-order + ``[num_vertices, 3]`` array specifying the ``x``, ``y``, and ``z`` vertex + positions in "stored model" coordinates. +- ``edges``: ``2*num_edges`` uint32le, as a C-order ``[num_edges, 2]`` array + specifying the source and target vertex index in the range ``[0, + num_vertices)``. +- For each additional attribute in ``vertex_attributes``: + + - ``attribute_data``: ``num_vertices * num_components`` elements of the + specified ``data_type`` in little-endian format. + +.. _precomputed-skeleton-format-unsharded: + +Unsharded format +---------------- + +In the unsharded format, the encoded skeleton data is stored as a separate file +within the same directory as the :file:`info` file under the name +:file:`{}`, where :file:`{}` is the base-10 string +representation of the segment ID. + +.. _precomputed-skeleton-format-sharded: + +Sharded format +-------------- + +In the :ref:`sharded format`, the encoded skeleton +data is retrieved using the segment ID as the key. The shard files are stored in +the same directory as the :file:`info` file. diff --git a/src/datasource/precomputed/volume.rst b/src/datasource/precomputed/volume.rst new file mode 100644 index 0000000000..95c9dfe2df --- /dev/null +++ b/src/datasource/precomputed/volume.rst @@ -0,0 +1,281 @@ +.. _precomputed-volume-format: + +Neuroglancer Precomputed Volume Format +====================================== + +The precomputed volume format stores 4-d XYZC single- or multi-resolution +arrays. The XYZ dimensions are chunked and optionally stored at multiple +resolutions, while the C (channel) dimension is neither chunked nor +multi-resolution. + +The volume format consists of a directory tree containing an :file:`info` +metadata file in JSON format, and the associated chunk data in the relative +paths specified in the metadata. + +.. _precomputed-volume-metadata: + +:file:`info` metadata format +---------------------------- + +.. json:schema:: PrecomputedVolume + +Chunked representation of volume data +------------------------------------- + +For each :json:schema:`scale` and chunk size +``chunk_size`` specified in +:json:schema:`~PrecomputedVolume.scales.chunk_sizes`, the volume (of voxel +dimensions ``size = [sx, sy, sz]``) is divided into a grid of ``grid_size = +ceil(size / chunk_size)`` chunks. + +The grid cell with grid coordinates ``g``, where ``0 <= g < grid_size``, +contains the :ref:`encoded data` for the +voxel-space subvolume ``[begin_offset, end_offset)``, where ``begin_offset = +voxel_offset + g * chunk_size`` and ``end_offset = voxel_offset + min((g + 1) * +chunk_size, size)``. Thus, the size of each subvolume is at most ``chunk_size`` +but may be truncated to fit within the dimensions of the volume. Each subvolume +is conceptually a 4-dimensional ``[x, y, z, channel]`` array. + +.. _precomputed-volume-unsharded-format: + +Unsharded chunk storage +~~~~~~~~~~~~~~~~~~~~~~~ + +If :json:schema:`~PrecomputedVolume.scales.sharding` parameters are not +specified for a scale, each chunk is stored as a separate file within the path +specified by the :json:schema:`~PrecomputedVolume.scales.key` property with the +name :file:`{xBegin}-{xEnd}_{yBegin}-{yEnd}_{zBegin}-{zEnd}`, where: + +- :file:`{xBegin}`, :file:`{yBegin}`, and :file:`{zBegin}` are substituted with + the base-10 string representations of the ``x``, ``y``, and ``z`` components + of ``begin_offset``, respectively; and +- :file:`{xEnd}`, :file:`{yEnd}`, and :file:`{zEnd}` are substituted with the + base-10 string representations of the ``x``, ``y``, and ``z`` components of + ``end_offset``, respectively. + +.. _precomputed-volume-sharded-format: + +Sharded chunk storage +~~~~~~~~~~~~~~~~~~~~~ + +If :json:schema:`~PrecomputedVolume.scales.sharding` parameters *are* specified +for a scale, the :ref:`sharded` representation of +the chunk data is stored within the directory specified by the +:json:schema:`~PrecomputedVolume.scales.key` property. Each chunk is identified +by a uint64 chunk identifier, equal to the :ref:`compressed format +code` of the grid cell coordinates, which is +used as a key to retrieve the encoded chunk data from sharded representation. + +.. _precomputed-compressed-morton-code: + +Compressed morton code +^^^^^^^^^^^^^^^^^^^^^^ + +The *compressed Morton code* is a variant of the normal `Morton code +`__ where bits that would be equal +to 0 for all grid cells are skipped. + +.. note:: + + Storing a normal 3-D Morton code in a uint64 value would only allow 21 bits + for each of the three dimensions. + +In the following, we list each potentially used bit with a hexadecimal letter, +so a 21-bit X coordinate would look like this:: + + x = ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---4 3210 fedc ba98 7654 3210 + +after spacing out by 2 to allow interleaved Y and Z bits, it becomes:: + + x = ---4 --3- -2-- 1--0 --f- -e-- d--c --b- -a-- 9--8 --7- -6-- 5--4 --3- -2-- 1--0`` + +For standard morton code, we'd shift ``Y << 1`` and ``Z << 2`` then OR the three +resulting uint64. But most datasets aren't symmetrical in size across +dimensions. + +Using compressed 3-D Morton code lets us use bits asymmetrically and conserve +bits where some dimensions are smaller and those bits would always be zero. +Compressed morton code drops the bits that would be zero across all entries +because that dimension is limited in size. Say the X has max size 42,943 which +requires only 16 bits (~64K) and would only use up to the "f" bit in the above +diagram. The bits corresponding to the most-significant ``4``, ``3``, ``2``, +``1``, and ``0`` bits would always be zero and therefore can be removed. + +This allows us to fit more data into the single uint64, as the following example +shows with Z having a 24 bit range. + +Start with a X coordinate that for this example has a max of 16 bits:: + + x = ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- fedc ba98 7654 3210 + +after spacing, note MSB ``f`` only has room for the Z bit since Y has dropped out:: + + x = ---- ---- ---- ---- ---f -e-- d--c --b- -a-- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + +Start with a Y coordinate that for this example has a max of 14 bits:: + + y = ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --dc ba98 7654 3210 + +after spacing with constant 2 bits since Y has smallest range:: + + y = ---- ---- ---- ---- ---- ---- d--c --b- -a-- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + +after shifting by 1 for future interleaving to get morton code:: + + y = ---- ---- ---- ---- ---- ---d --c- -b-- a--9 --8- -7-- 6--5 --4- -3-- 2--1 --0- + +Start with a Z coordinate that for this example has a max of 24 bits:: + z = ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 7654 3210 fedc ba98 7654 3210 + +after spacing out Z with 24 bits max; note compression of MSB due to X and Y dropout:: + + z = ---- ---- ---- 7654 3210 f-e- d--c --b- -a-- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + +after shifting by 2 for future interleaving:: + + z = ---- ---- --76 5432 10f- e-d- -c-- b--a --9- -8-- 7--6 --5- -4-- 3--2 --1- -0-- + +Now if you OR the final X, Y, and Z you see no collisions:: + + x = ---- ---- ---- ---- ---f -e-- d--c --b- -a-- 9--8 --7- -6-- 5--4 --3- -2-- 1--0 + y = ---- ---- ---- ---- ---- ---d --c- -b-- a--9 --8- -7-- 6--5 --4- -3-- 2--1 --0- + z = ---- ---- --76 5432 10f- e-d- -c-- b--a --9- -8-- 7--6 --5- -4-- 3--2 --1- -0-- + +While the above may be the simplest way to understand compressed Morton codes, +the algorithm can be implemented more simply by iteratively going bit by bit +from LSB to MSB and keeping track of the interleaved output bit. + +Specifically, given the coordinates ``g`` for a grid cell, where ``0 <= g < +grid_size``, the compressed Morton code is computed as follows: + +1. Set ``j := 0``. + +2. For ``i`` from ``0`` to ``n-1``, where ``n`` is the number of bits needed to + encode the grid cell coordinates: + + - For ``dim`` in ``0, 1, 2`` (corresponding to ``x``, ``y``, ``z``): + + - If ``2**i < grid_size[dim]``: + + - Set output bit ``j`` of the compressed Morton code to bit ``i`` of ``g[dim]``. + - Set ``j := j + 1``. + +.. _precomputed-volume-chunk-encoding: + +Chunk encoding +-------------- + +The of the subvolume data in each chunk depends on the specified +:json:schema:`~PrecomputedVolume.scales.encoding`. + +.. _precomputed-volume-encoding-raw: + +raw +~~~ + +Each chunk is stored directly in little-endian binary format in ``[x, y, z, +channel]`` Fortran order (i.e. consecutive ``x`` values are contiguous) without +any header. For example, if the chunk has dimensions ``[32, 32, 32, 1]`` and has +a :json:schema:`~PrecomputedVolume.data_type` of :json:`"uint32"`, then the +encoded chunk should have a length of 131072 bytes. + +.. list-table:: + + * - Supported :json:schema:`~PrecomputedVolume.data_type` + - Any + * - Supported :json:schema:`~PrecomputedVolume.num_channels` + - Any + +.. _precomputed-volume-encoding-compressed-segmentation: + +compressed_segmentation +~~~~~~~~~~~~~~~~~~~~~~~ + +Each chunk is encoded using the multi-channel `compressed +segmentation format +`__. +The compression block size is specified by the +:json:schema:`~PrecomputedVolume.scales.compressed_segmentation_block_size` +metadata property. + +.. list-table:: + + * - Supported :json:schema:`~PrecomputedVolume.data_type` + - :json:`"uint32"` or :json:`"uint64"` + * - Supported :json:schema:`~PrecomputedVolume.num_channels` + - Any + +.. _precomputed-volume-encoding-compresso: + +compresso +~~~~~~~~~ + +Each chunk is encoded in `Compresso format +`__. + +2-d image format encodings +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +When using 2-d image format-based encodings, each chunk is encoded as an image +where the number of components is equal to +:json:schema:`~PrecomputedVolume.num_channels`. The width and height of the +image may be arbitrary, provided that the total number of pixels is equal to the +product of the x, y, and z dimensions of the subvolume, and that the 1-D array +obtained by concatenating the horizontal rows of the image corresponds to the +flattened ``[X, Y, Z]`` Fortran-order representation of the subvolume. + +.. note:: + + For effective compression (and to minimize artifacts when using lossy + compression), however, it is recommended to use either ``[X, Y * Z]`` or + ``[X * Y, Z]`` as the width and height, respectively. + +.. warning:: + + Lossy encodings should not be used for + :json:schema:`~PrecomputedVolume.type.segmentation` volumes or + :json:schema:`~PrecomputedVolume.type.image` volumes where it is important to + retain the precise values. + +.. _precomputed-volume-encoding-jpeg: + +jpeg +^^^^ + +Each chunk is encoded as a `JPEG `__ image. + +.. list-table:: + + * - Supported :json:schema:`~PrecomputedVolume.data_type` + - :json:`"uint8"` + * - Supported :json:schema:`~PrecomputedVolume.num_channels` + - 1 or 3 + +.. _precomputed-volume-encoding-png: + +png +~~~ + +Each chunk is encoded as a `PNG `__ image. + +.. list-table:: + + * - Supported :json:schema:`~PrecomputedVolume.data_type` + - :json:`"uint8"` or :json:`"uint16"` + * - Supported :json:schema:`~PrecomputedVolume.num_channels` + - 1-4 + +.. _precomputed-volume-encoding-jxl: + +jxl +~~~ + +Each chunk is encoded as a `JPEG-XL `__ +image. + +.. list-table:: + + * - Supported :json:schema:`~PrecomputedVolume.data_type` + - :json:`"uint8"` + * - Supported :json:schema:`~PrecomputedVolume.num_channels` + - 1, 3, or 4 diff --git a/src/datasource/python/backend.ts b/src/datasource/python/backend.ts index 134ef939bc..988e7533be 100644 --- a/src/datasource/python/backend.ts +++ b/src/datasource/python/backend.ts @@ -38,12 +38,8 @@ import { VolumeChunk, VolumeChunkSource, } from "#src/sliceview/volume/backend.js"; -import { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); @@ -59,7 +55,7 @@ export class PythonVolumeChunkSource extends WithParameters( chunkDecoder = chunkDecoders.get(this.parameters["encoding"])!; encoding = VolumeChunkEncoding[this.parameters.encoding].toLowerCase(); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; let path = `../../neuroglancer/${this.encoding}/${parameters.key}/${parameters.scaleKey}`; { @@ -74,13 +70,10 @@ export class PythonVolumeChunkSource extends WithParameters( path += (chunkPosition[i] + chunkDataSize[i]).toString(); } } - const response = await cancellableFetchOk( - new URL(path, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ); - await this.chunkDecoder(chunk, cancellationToken, response); + const response = await fetchOk(new URL(path, parameters.baseUrl).href, { + signal: signal, + }); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } @@ -112,17 +105,16 @@ export class PythonMeshSource extends WithParameters( return Promise.resolve(undefined); } - downloadFragment(chunk: FragmentChunk, cancellationToken: CancellationToken) { + downloadFragment(chunk: FragmentChunk, signal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/mesh/${parameters.key}/${ chunk.manifestChunk!.objectId }`; - return cancellableFetchOk( - new URL(requestPath, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => decodeFragmentChunk(chunk, response)); + return fetchOk(new URL(requestPath, parameters.baseUrl).href, { + signal: signal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => decodeFragmentChunk(chunk, response)); } } @@ -131,16 +123,15 @@ export class PythonSkeletonSource extends WithParameters( SkeletonSource, SkeletonSourceParameters, ) { - download(chunk: SkeletonChunk, cancellationToken: CancellationToken) { + download(chunk: SkeletonChunk, signal: AbortSignal) { const { parameters } = this; const requestPath = `../../neuroglancer/skeleton/${parameters.key}/${chunk.objectId}`; - return cancellableFetchOk( - new URL(requestPath, parameters.baseUrl).href, - {}, - responseArrayBuffer, - cancellationToken, - ).then((response) => - decodeSkeletonChunk(chunk, response, parameters.vertexAttributes), - ); + return fetchOk(new URL(requestPath, parameters.baseUrl).href, { + signal: signal, + }) + .then((response) => response.arrayBuffer()) + .then((response) => + decodeSkeletonChunk(chunk, response, parameters.vertexAttributes), + ); } } diff --git a/src/datasource/python/frontend.ts b/src/datasource/python/frontend.ts index 73e6b4943b..a417a68e30 100644 --- a/src/datasource/python/frontend.ts +++ b/src/datasource/python/frontend.ts @@ -65,7 +65,6 @@ import { VolumeChunkSource, } from "#src/sliceview/volume/frontend.js"; import { transposeNestedArrays } from "#src/util/array.js"; -import { Borrowed, Owned } from "#src/util/disposable.js"; import { fetchOk } from "#src/util/http_request.js"; import { parseFixedLengthArray, @@ -94,20 +93,18 @@ function WithPythonDataSource< >, >(Base: TBase) { type Options = InstanceType["OPTIONS"] & { - dataSource: Borrowed; + dataSource: PythonDataSource; generation: number; }; class C extends Base { - OPTIONS: Options; - dataSource: Owned; + declare OPTIONS: Options; + dataSource: PythonDataSource; generation: number; - parameters: PythonSourceParameters; + declare parameters: PythonSourceParameters; constructor(...args: any[]) { super(...args); const options: Options = args[1]; - const dataSource = (this.dataSource = this.registerDisposer( - options.dataSource.addRef(), - )); + const dataSource = (this.dataSource = options.dataSource); this.generation = options.generation; const key = options.parameters.key; dataSource.registerSource(key, this); @@ -238,7 +235,7 @@ export class PythonMultiscaleVolumeChunkSource extends MultiscaleVolumeChunkSour // TODO(jbms): Properly handle reference counting of `dataSource`. constructor( - public dataSource: Borrowed, + public dataSource: PythonDataSource, chunkManager: ChunkManager, public key: string, public response: any, @@ -480,17 +477,19 @@ function getVolumeDataSource( options: GetDataSourceOptions, key: string, ) { - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "python:VolumeDataSource", key }, - async () => { + options, + async (progressOptions) => { const response = await ( await fetchOk( new URL(`../../neuroglancer/info/${key}`, window.location.href).href, + progressOptions, ) ).json(); const volume = new PythonMultiscaleVolumeChunkSource( dataSourceProvider, - options.chunkManager, + options.registry.chunkManager, key, response, ); @@ -527,14 +526,17 @@ function getVolumeDataSource( default: true, subsourceToModelSubspaceTransform, subsource: { - mesh: options.chunkManager.getChunkSource(PythonMeshSource, { - dataSource: dataSourceProvider, - generation: volume.generation, - parameters: { - baseUrl: window.location.href, - key: key, + mesh: options.registry.chunkManager.getChunkSource( + PythonMeshSource, + { + dataSource: dataSourceProvider, + generation: volume.generation, + parameters: { + baseUrl: window.location.href, + key: key, + }, }, - }), + ), }, }); } @@ -548,15 +550,17 @@ function getSkeletonDataSource( options: GetDataSourceOptions, key: string, ) { - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "python:SkeletonDataSource", key }, - async () => { + options, + async (progressOptions) => { const response = await ( await fetchOk( new URL( `../../neuroglancer/skeletoninfo/${key}`, window.location.href, ).href, + progressOptions, ) ).json(); const { baseModelSpace, subsourceToModelTransform } = @@ -567,7 +571,7 @@ function getSkeletonDataSource( (x) => verifyObjectAsMap(x, parseVertexAttributeInfo), ); const generation = verifyObjectProperty(response, "generation", (x) => x); - const skeletonSource = options.chunkManager.getChunkSource( + const skeletonSource = options.registry.chunkManager.getChunkSource( PythonSkeletonSource, { dataSource: dataSourceProvider, @@ -597,10 +601,14 @@ function getSkeletonDataSource( ); } -export class PythonDataSource extends DataSourceProvider { +export class PythonDataSource implements DataSourceProvider { private sources = new Map>(); sourceGenerations = new Map(); + get scheme() { + return "python"; + } + registerSource(key: string, source: PythonChunkSource) { let existingSet = this.sources.get(key); if (existingSet === undefined) { diff --git a/typings/glsl-editor.d.ts b/src/datasource/python/register_default.ts similarity index 71% rename from typings/glsl-editor.d.ts rename to src/datasource/python/register_default.ts index c32e7ba06d..d70ae3dfdb 100644 --- a/typings/glsl-editor.d.ts +++ b/src/datasource/python/register_default.ts @@ -1,6 +1,6 @@ /** * @license - * Copyright 2020 Google Inc. + * Copyright 2024 Google Inc. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -14,11 +14,7 @@ * limitations under the License. */ -/** - * Basic typings for glsl-editor package. - */ -declare module "glsl-editor/glsl.js" { - import CodeMirror from "codemirror"; - const f: (codeMirror: typeof CodeMirror) => void; - export default f; -} +import { registerProvider } from "#src/datasource/default_provider.js"; +import { PythonDataSource } from "#src/datasource/python/frontend.js"; + +registerProvider(new PythonDataSource()); diff --git a/src/datasource/render/backend.ts b/src/datasource/render/backend.ts index ad53c010c4..bd78682201 100644 --- a/src/datasource/render/backend.ts +++ b/src/datasource/render/backend.ts @@ -23,27 +23,19 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postpr import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { Endianness } from "#src/util/endian.js"; import { vec3 } from "#src/util/geom.js"; -import { - cancellableFetchOk, - responseArrayBuffer, -} from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; const chunkDecoders = new Map(); chunkDecoders.set( "jpg", - async ( - chunk: VolumeChunk, - cancellationToken: CancellationToken, - response: ArrayBuffer, - ) => { + async (chunk: VolumeChunk, signal: AbortSignal, response: ArrayBuffer) => { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - cancellationToken, + signal, [response], new Uint8Array(response), undefined, @@ -52,11 +44,11 @@ chunkDecoders.set( 3, true, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, signal, decoded); }, ); -chunkDecoders.set("raw16", (chunk, cancellationToken, response) => { - return decodeRawChunk(chunk, cancellationToken, response, Endianness.BIG); +chunkDecoders.set("raw16", (chunk, signal, response) => { + return decodeRawChunk(chunk, signal, response, Endianness.BIG); }); @registerSharedObject() @@ -95,7 +87,7 @@ export class TileChunkSource extends WithParameters( return query_params.join("&"); })(); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { const { parameters } = this; const { chunkGridPosition } = chunk; @@ -124,12 +116,10 @@ export class TileChunkSource extends WithParameters( imageMethod = "jpeg-image"; } const path = `/render-ws/v1/owner/${parameters.owner}/project/${parameters.project}/stack/${parameters.stack}/z/${chunkPosition[2]}/box/${chunkPosition[0]},${chunkPosition[1]},${xTileSize},${yTileSize},${scale}/${imageMethod}`; - const response = await cancellableFetchOk( + const response = await fetchOk( `${parameters.baseUrl}${path}?${this.queryString}`, - {}, - responseArrayBuffer, - cancellationToken, + { signal: signal }, ); - await this.chunkDecoder(chunk, cancellationToken, response); + await this.chunkDecoder(chunk, signal, await response.arrayBuffer()); } } diff --git a/src/datasource/render/frontend.ts b/src/datasource/render/frontend.ts index 66370a7154..46d700430e 100644 --- a/src/datasource/render/frontend.ts +++ b/src/datasource/render/frontend.ts @@ -32,8 +32,8 @@ import type { CompletionResult, DataSource, GetDataSourceOptions, + DataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; import { TileChunkSourceParameters } from "#src/datasource/render/base.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; @@ -64,6 +64,7 @@ import { verifyOptionalString, verifyString, } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; const VALID_ENCODINGS = new Set(["jpg", "raw16"]); @@ -249,7 +250,7 @@ function parseStackVersionInfo(stackVersionObj: any): vec3 { "stackResolutionZ", verifyFloat, ); - } catch (ignoredError) { + } catch { // default is 1, 1, 1 voxelResolution[0] = 1; voxelResolution[1] = 1; @@ -505,11 +506,13 @@ export function getOwnerInfo( chunkManager: ChunkManager, hostname: string, owner: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "render:getOwnerInfo", hostname, owner }, - () => - fetchOk(`${hostname}/render-ws/v1/owner/${owner}/stacks`) + options, + (progressOptions) => + fetchOk(`${hostname}/render-ws/v1/owner/${owner}/stacks`, progressOptions) .then((response) => response.json()) .then(parseOwnerInfo), ); @@ -519,7 +522,11 @@ const pathPattern = /^([^/?]+)(?:\/([^/?]+))?(?:\/([^/?]+))(?:\/([^/?]*))?(?:\?(.*))?$/; const urlPattern = /^((?:(?:(?:http|https):\/\/[^,/]+)[^/?]))\/(.*)$/; -function getVolume(chunkManager: ChunkManager, datasourcePath: string) { +function getVolume( + chunkManager: ChunkManager, + datasourcePath: string, + options: Partial, +) { let hostname: string; let path: string; { @@ -543,10 +550,16 @@ function getVolume(chunkManager: ChunkManager, datasourcePath: string) { const parameters = parseQueryStringParameters(match[5] || ""); - return chunkManager.memoize.getUncounted( + return chunkManager.memoize.getAsync( { type: "render:MultiscaleVolumeChunkSource", hostname, path }, - async () => { - const ownerInfo = await getOwnerInfo(chunkManager, hostname, owner); + options, + async (progressOptions) => { + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + owner, + progressOptions, + ); const volume = new RenderMultiscaleVolumeChunkSource( chunkManager, hostname, @@ -599,6 +612,7 @@ export async function stackAndProjectCompleter( chunkManager: ChunkManager, hostname: string, path: string, + options: Partial, ): Promise { const stackMatch = path.match( /^(?:([^/]+)(?:\/([^/]*))?(?:\/([^/]*))?(\/.*?)?)?$/, @@ -613,7 +627,12 @@ export async function stackAndProjectCompleter( } if (stackMatch[3] === undefined) { const projectPrefix = stackMatch[2] || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const completions = getPrefixMatchesWithDescriptions( projectPrefix, ownerInfo.projects, @@ -624,7 +643,12 @@ export async function stackAndProjectCompleter( } if (stackMatch[4] === undefined) { const stackPrefix = stackMatch[3] || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const projectInfo = ownerInfo.projects.get(stackMatch[2]); if (projectInfo === undefined) { throw null; @@ -643,7 +667,12 @@ export async function stackAndProjectCompleter( }; } const channelPrefix = stackMatch[4].substr(1) || ""; - const ownerInfo = await getOwnerInfo(chunkManager, hostname, stackMatch[1]); + const ownerInfo = await getOwnerInfo( + chunkManager, + hostname, + stackMatch[1], + options, + ); const projectInfo = ownerInfo.projects.get(stackMatch[2]); if (projectInfo === undefined) { throw null; @@ -673,6 +702,7 @@ export async function stackAndProjectCompleter( export async function volumeCompleter( url: string, chunkManager: ChunkManager, + options: Partial, ): Promise { const match = url.match(urlPattern); if (match === null) { @@ -686,18 +716,30 @@ export async function volumeCompleter( chunkManager, hostname, path, + options, ); return applyCompletionOffset(match![1].length + 1, completions); } -export class RenderDataSource extends DataSourceProvider { +export class RenderDataSource implements DataSourceProvider { + get scheme() { + return "render"; + } get description() { return "Render"; } get(options: GetDataSourceOptions): Promise { - return getVolume(options.chunkManager, options.providerUrl); + return getVolume( + options.registry.chunkManager, + options.providerUrl, + options, + ); } completeUrl(options: CompleteUrlOptions) { - return volumeCompleter(options.providerUrl, options.chunkManager); + return volumeCompleter( + options.providerUrl, + options.registry.chunkManager, + options, + ); } } diff --git a/src/datasource/render/index.rst b/src/datasource/render/index.rst new file mode 100644 index 0000000000..e4e6550049 --- /dev/null +++ b/src/datasource/render/index.rst @@ -0,0 +1,14 @@ +.. _render-datasource: + +Render +====== + +The Render :ref:`data service driver` enables Neuroglancer to +view transformed volumes served by the `Render +`__ service. + +URL syntax +---------- + +- :file:`render://https://{host}/{owner}/{project}/{stack}/{channel}` +- :file:`render://http://{host}/{owner}/{project}/{stack}/{channel}` diff --git a/src/datasource/render/register_default.ts b/src/datasource/render/register_default.ts index ae5a9241a0..3c4f1c8d27 100644 --- a/src/datasource/render/register_default.ts +++ b/src/datasource/render/register_default.ts @@ -17,4 +17,4 @@ import { registerProvider } from "#src/datasource/default_provider.js"; import { RenderDataSource } from "#src/datasource/render/frontend.js"; -registerProvider("render", () => new RenderDataSource()); +registerProvider(new RenderDataSource()); diff --git a/src/datasource/state_share.ts b/src/datasource/state_share.ts index 9535ba2c66..40f48657fc 100644 --- a/src/datasource/state_share.ts +++ b/src/datasource/state_share.ts @@ -1,11 +1,7 @@ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { ReadableHttpKvStore } from "#src/kvstore/http/common.js"; +import { joinBaseUrlAndPath } from "#src/kvstore/url.js"; import { StatusMessage } from "#src/status.js"; import { RefCounted } from "#src/util/disposable.js"; -import { responseJson } from "#src/util/http_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Viewer } from "#src/viewer.js"; import { makeIcon } from "#src/widget/icon.js"; @@ -78,28 +74,32 @@ export class StateShare extends RefCounted { const selectedStateServer = this.selectStateServerElement ? this.selectStateServerElement.value : Object.values(STATE_SERVERS)[0].url; - const protocol = new URL(selectedStateServer).protocol; - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - selectedStateServer, - defaultCredentialsManager, - ); + + const { store, path } = + viewer.dataSourceProvider.sharedKvStoreContext.kvStoreContext.getKvStore( + selectedStateServer, + ); + + if (!(store instanceof ReadableHttpKvStore)) { + throw new Error( + `Non-HTTP protocol not supported: ${selectedStateServer}`, + ); + } StatusMessage.forPromise( - cancellableFetchSpecialOk( - credentialsProvider, - parsedUrl, - { + store + .fetchOkImpl(joinBaseUrlAndPath(store.baseUrl, path), { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(viewer.state.toJSON()), - }, - responseJson, - ) + }) + .then((response) => response.json()) .then((res) => { const stateUrlProtcol = new URL(res).protocol; const stateUrlWithoutProtocol = res.substring( stateUrlProtcol.length, ); + const protocol = new URL(selectedStateServer).protocol; const link = `${window.location.origin}/#!${protocol}${stateUrlWithoutProtocol}`; navigator.clipboard.writeText(link).then(() => { StatusMessage.showTemporaryMessage( diff --git a/src/datasource/vtk/backend.ts b/src/datasource/vtk/backend.ts index d58fd46af6..2fea82efd0 100644 --- a/src/datasource/vtk/backend.ts +++ b/src/datasource/vtk/backend.ts @@ -16,20 +16,25 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import { parseVTKFromArrayBuffer } from "#src/async_computation/vtk_mesh_request.js"; -import { GenericSharedDataSource } from "#src/chunk_manager/generic_file_source.js"; +import { getCachedDecodedUrl } from "#src/chunk_manager/generic_file_source.js"; +import type { ReadResponse } from "#src/kvstore/index.js"; import type { SingleMesh } from "#src/single_mesh/backend.js"; import { registerSingleMeshFactory } from "#src/single_mesh/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; /** - * This needs to be a global function, because it identifies the instance of GenericSharedDataSource + * This needs to be a global function, because it identifies the instance of SimpleAsyncCache * to use. */ -function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { +async function parse( + readResponse: ReadResponse, + progressOptions: Partial, +) { + const buffer = await readResponse.response.arrayBuffer(); return requestAsyncComputation( parseVTKFromArrayBuffer, - cancellationToken, + progressOptions.signal, [buffer], buffer, ); @@ -37,39 +42,31 @@ function parse(buffer: ArrayBuffer, cancellationToken: CancellationToken) { registerSingleMeshFactory("vtk", { description: "VTK", - getMesh: ( - chunkManager, - credentialsProvider, - url, - getPriority, - cancellationToken, - ) => - GenericSharedDataSource.getUrl( - chunkManager, - credentialsProvider, - parse, + getMesh: async (sharedKvStoreContext, url, options) => { + const mesh = await getCachedDecodedUrl( + sharedKvStoreContext, url, - getPriority, - cancellationToken, - ).then((mesh) => { - const result: SingleMesh = { - info: { - numTriangles: mesh.numTriangles, - numVertices: mesh.numVertices, - vertexAttributes: [], - }, - indices: mesh.indices, - vertexPositions: mesh.vertexPositions, + parse, + options, + ); + const result: SingleMesh = { + info: { + numTriangles: mesh.numTriangles, + numVertices: mesh.numVertices, vertexAttributes: [], - }; - for (const attribute of mesh.vertexAttributes) { - result.info.vertexAttributes.push({ - name: attribute.name, - dataType: DataType.FLOAT32, - numComponents: attribute.numComponents, - }); - result.vertexAttributes.push(attribute.data); - } - return result; - }), + }, + indices: mesh.indices, + vertexPositions: mesh.vertexPositions, + vertexAttributes: [], + }; + for (const attribute of mesh.vertexAttributes) { + result.info.vertexAttributes.push({ + name: attribute.name, + dataType: DataType.FLOAT32, + numComponents: attribute.numComponents, + }); + result.vertexAttributes.push(attribute.data); + } + return result; + }, }); diff --git a/src/datasource/vtk/frontend.ts b/src/datasource/vtk/frontend.ts deleted file mode 100644 index 086dbf54fb..0000000000 --- a/src/datasource/vtk/frontend.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - makeCoordinateSpace, - makeIdentityTransform, -} from "#src/coordinate_transform.js"; -import type { - CompleteUrlOptions, - DataSource, - GetDataSourceOptions, -} from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; -import { getSingleMeshSource } from "#src/single_mesh/frontend.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; - -export class VtkDataSource extends DataSourceProvider { - get description() { - return "VTK mesh file"; - } - - async get(options: GetDataSourceOptions): Promise { - const meshSource = await getSingleMeshSource( - options.chunkManager, - options.credentialsManager, - options.url, - ); - const modelSpace = makeCoordinateSpace({ - rank: 3, - names: ["x", "y", "z"], - units: ["m", "m", "m"], - scales: Float64Array.of(1e-9, 1e-9, 1e-9), - }); - const dataSource: DataSource = { - modelTransform: makeIdentityTransform(modelSpace), - subsources: [ - { - id: "default", - default: true, - subsource: { singleMesh: meshSource }, - }, - ], - }; - return dataSource; - } - completeUrl(options: CompleteUrlOptions) { - return completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, - ); - } -} diff --git a/src/datasource/vtk/parse.ts b/src/datasource/vtk/parse.ts index a5107d7e18..39069bab42 100644 --- a/src/datasource/vtk/parse.ts +++ b/src/datasource/vtk/parse.ts @@ -49,7 +49,7 @@ export interface VTKHeader { export interface VertexAttribute { name: string; - data: Float32Array; + data: Float32Array; numComponents: number; tableName: string; dataType: string; @@ -59,9 +59,9 @@ export class TriangularMesh { constructor( public header: VTKHeader, public numVertices: number, - public vertexPositions: Float32Array, + public vertexPositions: Float32Array, public numTriangles: number, - public indices: Uint32Array, + public indices: Uint32Array, public vertexAttributes: VertexAttribute[], ) {} } diff --git a/src/datasource/vtk/register_default.ts b/src/datasource/vtk/register_default.ts index 3c3b4e571f..7bf980be94 100644 --- a/src/datasource/vtk/register_default.ts +++ b/src/datasource/vtk/register_default.ts @@ -14,7 +14,13 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { VtkDataSource } from "#src/datasource/vtk/frontend.js"; +import { + registerKvStoreBasedDataProvider, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { SingleMeshDataSource } from "#src/single_mesh/frontend.js"; -registerProvider("vtk", () => new VtkDataSource()); +const provider = new SingleMeshDataSource("vtk", "VTK mesh"); +registerKvStoreBasedDataProvider(provider); +registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); diff --git a/src/datasource/zarr/backend.ts b/src/datasource/zarr/backend.ts index 66e23bea90..7370f7af0e 100644 --- a/src/datasource/zarr/backend.ts +++ b/src/datasource/zarr/backend.ts @@ -20,7 +20,6 @@ import "#src/datasource/zarr/codec/bytes/decode.js"; import "#src/datasource/zarr/codec/crc32c/decode.js"; import { WithParameters } from "#src/chunk_manager/backend.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; import { applySharding, @@ -30,31 +29,24 @@ import "#src/datasource/zarr/codec/gzip/decode.js"; import "#src/datasource/zarr/codec/sharding_indexed/decode.js"; import "#src/datasource/zarr/codec/transpose/decode.js"; import { ChunkKeyEncoding } from "#src/datasource/zarr/metadata/index.js"; -import { getSpecialProtocolKvStore } from "#src/kvstore/special/index.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { VolumeChunkSource } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; import { registerSharedObject } from "#src/worker_rpc.js"; @registerSharedObject() export class ZarrVolumeChunkSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - VolumeChunkSource, - ), + WithSharedKvStoreContextCounterpart(VolumeChunkSource), VolumeChunkSourceParameters, ) { private chunkKvStore = applySharding( this.chunkManager, this.parameters.metadata.codecs, - getSpecialProtocolKvStore( - this.credentialsProvider, - this.parameters.url + "/", - ), + this.sharedKvStoreContext.kvStoreContext.getKvStore(this.parameters.url), ); - async download(chunk: VolumeChunk, cancellationToken: CancellationToken) { + async download(chunk: VolumeChunk, signal: AbortSignal) { chunk.chunkDataSize = this.spec.chunkDataSize; const { parameters } = this; const { chunkGridPosition } = chunk; @@ -94,15 +86,15 @@ export class ZarrVolumeChunkSource extends WithParameters( const { chunkKvStore } = this; const response = await chunkKvStore.kvStore.read( chunkKvStore.getChunkKey(chunkGridPosition, baseKey), - { cancellationToken }, + { signal }, ); if (response !== undefined) { const decoded = await decodeArray( chunkKvStore.decodeCodecs, - response.data, - cancellationToken, + new Uint8Array(await response.response.arrayBuffer()), + signal, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, signal, decoded); } } } diff --git a/src/datasource/zarr/codec/blosc/decode.ts b/src/datasource/zarr/codec/blosc/decode.ts index f7d125f1df..6931f9c8dc 100644 --- a/src/datasource/zarr/codec/blosc/decode.ts +++ b/src/datasource/zarr/codec/blosc/decode.ts @@ -19,20 +19,15 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import type { Configuration } from "#src/datasource/zarr/codec/blosc/resolve.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "blosc", kind: CodecKind.bytesToBytes, - decode( - configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { + decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; return requestAsyncComputation( decodeBlosc, - cancellationToken, + signal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/codec/bytes/decode.ts b/src/datasource/zarr/codec/bytes/decode.ts index 53ae1eda0a..d94353e097 100644 --- a/src/datasource/zarr/codec/bytes/decode.ts +++ b/src/datasource/zarr/codec/bytes/decode.ts @@ -18,7 +18,6 @@ import type { Configuration } from "#src/datasource/zarr/codec/bytes/resolve.js" import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; import { convertEndian } from "#src/util/endian.js"; @@ -28,10 +27,10 @@ registerCodec({ async decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { - cancellationToken; + encoded, + signal: AbortSignal, + ) { + signal; const { dataType, chunkShape } = decodedArrayInfo; const numElements = chunkShape.reduce((a, b) => a * b, 1); const bytesPerElement = DATA_TYPE_BYTES[dataType]; diff --git a/src/datasource/zarr/codec/crc32c/decode.ts b/src/datasource/zarr/codec/crc32c/decode.ts index 569b2b477c..6cf60c8c01 100644 --- a/src/datasource/zarr/codec/crc32c/decode.ts +++ b/src/datasource/zarr/codec/crc32c/decode.ts @@ -17,20 +17,15 @@ import type { Configuration } from "#src/datasource/zarr/codec/crc32c/resolve.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; const checksumSize = 4; registerCodec({ name: "crc32c", kind: CodecKind.bytesToBytes, - async decode( - configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { + async decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; - cancellationToken; + signal; if (encoded.length < checksumSize) { throw new Error( `Expected buffer of size at least ${checksumSize} bytes but received: ${encoded.length} bytes`, diff --git a/src/datasource/zarr/codec/decode.ts b/src/datasource/zarr/codec/decode.ts index bd5c5f49a7..2cc3ea9184 100644 --- a/src/datasource/zarr/codec/decode.ts +++ b/src/datasource/zarr/codec/decode.ts @@ -20,8 +20,7 @@ import type { CodecChainSpec, } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { ReadableKvStore } from "#src/kvstore/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; +import type { KvStoreWithPath, ReadableKvStore } from "#src/kvstore/index.js"; import type { RefCounted } from "#src/util/disposable.js"; export interface Codec { @@ -34,9 +33,9 @@ export interface ArrayToArrayCodec extends Codec { decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: ArrayBufferView, - cancellationToken: CancellationToken, - ): Promise; + encoded: ArrayBufferView, + signal: AbortSignal, + ): Promise>; } export interface ArrayToBytesCodec extends Codec { @@ -44,9 +43,9 @@ export interface ArrayToBytesCodec extends Codec { decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise; + encoded: Uint8Array, + signal: AbortSignal, + ): Promise>; } export type ShardingKey = { @@ -67,9 +66,9 @@ export interface BytesToBytesCodec extends Codec { kind: CodecKind.bytesToBytes; decode( configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise; + encoded: Uint8Array, + signal: AbortSignal, + ): Promise>; } const codecRegistry = { @@ -95,9 +94,9 @@ export function registerCodec( export async function decodeArray( codecs: CodecChainSpec, - encoded: Uint8Array, - cancellationToken: CancellationToken, -): Promise { + encoded: Uint8Array, + signal: AbortSignal, +): Promise> { const bytesToBytes = codecs[CodecKind.bytesToBytes]; for (let i = bytesToBytes.length; i--; ) { const codec = bytesToBytes[i]; @@ -105,14 +104,10 @@ export async function decodeArray( if (impl === undefined) { throw new Error(`Unsupported codec: ${JSON.stringify(codec.name)}`); } - encoded = await impl.decode( - codec.configuration, - encoded, - cancellationToken, - ); + encoded = await impl.decode(codec.configuration, encoded, signal); } - let decoded: ArrayBufferView; + let decoded: ArrayBufferView; { const codec = codecs[CodecKind.arrayToBytes]; const impl = codecRegistry[CodecKind.arrayToBytes].get(codec.name); @@ -123,7 +118,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[codecs.arrayInfo.length - 1], encoded, - cancellationToken, + signal, ); } @@ -138,7 +133,7 @@ export async function decodeArray( codec.configuration, codecs.arrayInfo[i], decoded, - cancellationToken, + signal, ); } @@ -148,7 +143,7 @@ export async function decodeArray( export function applySharding( chunkManager: ChunkManager, codecs: CodecChainSpec, - baseKvStore: ReadableKvStore, + baseKvStore: KvStoreWithPath, ): { kvStore: ReadableKvStore; getChunkKey: ( @@ -157,7 +152,7 @@ export function applySharding( ) => unknown; decodeCodecs: CodecChainSpec; } { - let kvStore: ReadableKvStore = baseKvStore; + let kvStore: ReadableKvStore = baseKvStore.store; let curCodecs = codecs; while (true) { const { shardingInfo } = curCodecs; @@ -177,11 +172,13 @@ export function applySharding( const decodeCodecs = curCodecs; + const pathPrefix = baseKvStore.path; + function getChunkKey( chunkGridPosition: ArrayLike, baseKey: string, ): unknown { - let key: unknown = baseKey; + let key: unknown = pathPrefix + baseKey; const rank = chunkGridPosition.length; let curCodecs = codecs; while (curCodecs.shardingInfo !== undefined) { diff --git a/src/datasource/zarr/codec/gzip/decode.ts b/src/datasource/zarr/codec/gzip/decode.ts index 8003868eb9..f2f9263df7 100644 --- a/src/datasource/zarr/codec/gzip/decode.ts +++ b/src/datasource/zarr/codec/gzip/decode.ts @@ -17,19 +17,20 @@ import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { Configuration } from "#src/datasource/zarr/codec/gzip/resolve.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { decodeGzip } from "#src/util/gzip.js"; -registerCodec({ - name: "gzip", - kind: CodecKind.bytesToBytes, - async decode( - configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { - configuration; - cancellationToken; - return new Uint8Array(await decodeGzip(encoded)); - }, -}); +for (const [name, compressionFormat] of [ + ["gzip", "gzip"], + ["zlib", "deflate"], +] as const) { + registerCodec({ + name, + kind: CodecKind.bytesToBytes, + async decode(configuration: Configuration, encoded, signal: AbortSignal) { + configuration; + return new Uint8Array( + await decodeGzip(encoded, compressionFormat, signal), + ); + }, + }); +} diff --git a/src/datasource/zarr/codec/gzip/resolve.ts b/src/datasource/zarr/codec/gzip/resolve.ts index eec56f4c64..60d058247d 100644 --- a/src/datasource/zarr/codec/gzip/resolve.ts +++ b/src/datasource/zarr/codec/gzip/resolve.ts @@ -26,12 +26,14 @@ export interface Configuration { level: number; } -registerCodec({ - name: "gzip", - kind: CodecKind.bytesToBytes, - resolve(configuration: unknown): { configuration: Configuration } { - verifyObject(configuration); - const level = verifyObjectProperty(configuration, "level", verifyInt); - return { configuration: { level } }; - }, -}); +for (const name of ["gzip", "zlib"]) { + registerCodec({ + name, + kind: CodecKind.bytesToBytes, + resolve(configuration: unknown): { configuration: Configuration } { + verifyObject(configuration); + const level = verifyObjectProperty(configuration, "level", verifyInt); + return { configuration: { level } }; + }, + }); +} diff --git a/src/datasource/zarr/codec/sharding_indexed/decode.ts b/src/datasource/zarr/codec/sharding_indexed/decode.ts index 1c7a97ba0b..dbcb08bdaf 100644 --- a/src/datasource/zarr/codec/sharding_indexed/decode.ts +++ b/src/datasource/zarr/codec/sharding_indexed/decode.ts @@ -21,29 +21,80 @@ import { registerCodec, } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; -import type { Configuration } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import type { + Configuration, + IndexConfiguration, +} from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; import { ShardIndexLocation } from "#src/datasource/zarr/codec/sharding_indexed/resolve.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; import type { ByteRangeRequest, ReadableKvStore, - ReadOptions, + DriverReadOptions, ReadResponse, + StatResponse, + StatOptions, + ByteRange, } from "#src/kvstore/index.js"; -import { composeByteRangeRequest } from "#src/kvstore/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; import type { Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; type ShardIndex = BigUint64Array | undefined; const MISSING_VALUE = BigInt("18446744073709551615"); +type ShardIndexCache = SimpleAsyncCache; + +function makeIndexCache( + chunkManager: ChunkManager, + base: ReadableKvStore, + configuration: IndexConfiguration, +): ShardIndexCache { + return new SimpleAsyncCache(chunkManager.addRef(), { + get: async (key: BaseKey, progressOptions: ProgressOptions) => { + const { indexCodecs } = configuration; + const encodedSize = + indexCodecs.encodedSize[indexCodecs.encodedSize.length - 1]; + let byteRange: ByteRangeRequest; + switch (configuration.indexLocation) { + case ShardIndexLocation.START: + byteRange = { offset: 0, length: encodedSize! }; + break; + case ShardIndexLocation.END: + byteRange = { suffixLength: encodedSize! }; + break; + } + const response = await base.read(key, { + ...progressOptions, + byteRange, + }); + if (response === undefined) { + return { size: 0, data: undefined }; + } + const index = await decodeArray( + configuration.indexCodecs, + new Uint8Array(await response.response.arrayBuffer()), + progressOptions.signal, + ); + return { + size: index.byteLength, + data: new BigUint64Array( + index.buffer, + index.byteOffset, + index.byteLength / 8, + ), + }; + }, + }); +} + class ShardedKvStore extends RefCounted implements ReadableKvStore<{ base: BaseKey; subChunk: number[] }> { - private indexCache: Owned>; + private indexCache: Owned>; private indexStrides: number[]; constructor( private configuration: Configuration, @@ -52,42 +103,7 @@ class ShardedKvStore ) { super(); this.indexCache = this.registerDisposer( - new SimpleAsyncCache(chunkManager.addRef(), { - get: async (key: BaseKey, cancellationToken: CancellationToken) => { - const { indexCodecs } = configuration; - const encodedSize = - indexCodecs.encodedSize[indexCodecs.encodedSize.length - 1]; - let byteRange: ByteRangeRequest; - switch (configuration.indexLocation) { - case ShardIndexLocation.START: - byteRange = { offset: 0, length: encodedSize! }; - break; - case ShardIndexLocation.END: - byteRange = { suffixLength: encodedSize! }; - break; - } - const response = await base.read(key, { - cancellationToken, - byteRange, - }); - if (response === undefined) { - return { size: 0, data: undefined }; - } - const index = await decodeArray( - configuration.indexCodecs, - response.data, - cancellationToken, - ); - return { - size: index.byteLength, - data: new BigUint64Array( - index.buffer, - index.byteOffset, - index.byteLength / 8, - ), - }; - }, - }), + makeIndexCache(chunkManager, base, configuration), ); const { subChunkGridShape } = this.configuration; const rank = subChunkGridShape.length; @@ -107,14 +123,14 @@ class ShardedKvStore } } - async read( - key: { base: BaseKey; subChunk: number[] }, - options: ReadOptions, - ): Promise { - const shardIndex = await this.indexCache.get( - key.base, - options.cancellationToken ?? uncancelableToken, - ); + private async findKey( + key: { + base: BaseKey; + subChunk: number[]; + }, + progressOptions: Partial, + ): Promise { + const shardIndex = await this.indexCache.get(key.base, progressOptions); if (shardIndex === undefined) { // Shard not present. return undefined; @@ -133,42 +149,42 @@ class ShardedKvStore // Sub-chunk not present. return undefined; } - const fullByteRange = { + return { offset: Number(dataOffset), length: Number(dataLength), }; - const { outer: outerByteRange, inner: innerByteRange } = - composeByteRangeRequest(fullByteRange, options.byteRange); - if (outerByteRange.length === 0) { - return { - data: new Uint8Array(0), - dataRange: innerByteRange, - totalSize: fullByteRange.length, - }; - } - const response = await this.base.read(key.base, { - cancellationToken: options.cancellationToken, - byteRange: outerByteRange, - }); - if (response === undefined) { - // Shard unexpectedly deleted. - return undefined; - } - if ( - response.dataRange.offset !== outerByteRange.offset || - response.dataRange.length !== outerByteRange.length - ) { - throw new Error( - `Received truncated response, expected ${JSON.stringify( - outerByteRange, - )} but received ${JSON.stringify(response.dataRange)}`, - ); - } - return { - data: response.data, - dataRange: innerByteRange, - totalSize: fullByteRange.length, - }; + } + + async stat( + key: { base: BaseKey; subChunk: number[] }, + options: StatOptions, + ): Promise { + const fullByteRange = await this.findKey(key, options); + if (fullByteRange === undefined) return undefined; + return { totalSize: fullByteRange.length }; + } + + async read( + key: { base: BaseKey; subChunk: number[] }, + options: DriverReadOptions, + ): Promise { + const fullByteRange = await this.findKey(key, options); + if (fullByteRange === undefined) return undefined; + return new FileByteRangeHandle( + new KvStoreFileHandle(this.base, key.base), + fullByteRange, + ).read(options); + } + + getUrl(key: { base: BaseKey; subChunk: number[] }): string { + return `subchunk ${JSON.stringify(key.subChunk)} within shard ${this.base.getUrl(key.base)}`; + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; } } diff --git a/src/datasource/zarr/codec/sharding_indexed/resolve.ts b/src/datasource/zarr/codec/sharding_indexed/resolve.ts index 58fd2212d5..53aa858d02 100644 --- a/src/datasource/zarr/codec/sharding_indexed/resolve.ts +++ b/src/datasource/zarr/codec/sharding_indexed/resolve.ts @@ -38,9 +38,12 @@ export enum ShardIndexLocation { END, } -export interface Configuration { +export interface IndexConfiguration { indexCodecs: CodecChainSpec; indexLocation: ShardIndexLocation; +} + +export interface Configuration extends IndexConfiguration { subChunkCodecs: CodecChainSpec; subChunkShape: number[]; subChunkGridShape: number[]; diff --git a/src/datasource/zarr/codec/transpose/decode.ts b/src/datasource/zarr/codec/transpose/decode.ts index a08d4a36e8..3b15e228a6 100644 --- a/src/datasource/zarr/codec/transpose/decode.ts +++ b/src/datasource/zarr/codec/transpose/decode.ts @@ -18,7 +18,6 @@ import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import type { CodecArrayInfo } from "#src/datasource/zarr/codec/index.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { Configuration } from "#src/datasource/zarr/codec/transpose/resolve.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "transpose", @@ -26,11 +25,11 @@ registerCodec({ async decode( configuration: Configuration, decodedArrayInfo: CodecArrayInfo, - encoded: ArrayBufferView, - cancellationToken: CancellationToken, - ): Promise { + encoded, + signal: AbortSignal, + ) { decodedArrayInfo; - cancellationToken; + signal; configuration; return encoded; }, diff --git a/src/datasource/zarr/codec/zstd/decode.ts b/src/datasource/zarr/codec/zstd/decode.ts index f29aef6dbd..157ebf7a57 100644 --- a/src/datasource/zarr/codec/zstd/decode.ts +++ b/src/datasource/zarr/codec/zstd/decode.ts @@ -19,20 +19,15 @@ import { requestAsyncComputation } from "#src/async_computation/request.js"; import { registerCodec } from "#src/datasource/zarr/codec/decode.js"; import { CodecKind } from "#src/datasource/zarr/codec/index.js"; import type { Configuration } from "#src/datasource/zarr/codec/zstd/resolve.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; registerCodec({ name: "zstd", kind: CodecKind.bytesToBytes, - decode( - configuration: Configuration, - encoded: Uint8Array, - cancellationToken: CancellationToken, - ): Promise { + decode(configuration: Configuration, encoded, signal: AbortSignal) { configuration; return requestAsyncComputation( decodeZstd, - cancellationToken, + signal, [encoded.buffer], encoded, ); diff --git a/src/datasource/zarr/frontend.ts b/src/datasource/zarr/frontend.ts index a56a4eeff7..3060a75fe6 100644 --- a/src/datasource/zarr/frontend.ts +++ b/src/datasource/zarr/frontend.ts @@ -18,7 +18,6 @@ import "#src/datasource/zarr/codec/blosc/resolve.js"; import "#src/datasource/zarr/codec/zstd/resolve.js"; import { makeDataBoundsBoundingBoxAnnotationSet } from "#src/annotation/index.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { WithParameters } from "#src/chunk_manager/frontend.js"; import type { CoordinateSpace } from "#src/coordinate_transform.js"; import { @@ -26,13 +25,12 @@ import { makeIdentityTransform, makeIdentityTransformedBoundingBox, } from "#src/coordinate_transform.js"; -import { WithCredentialsProvider } from "#src/credentials_provider/chunk_source_frontend.js"; import type { - CompleteUrlOptions, DataSource, - GetDataSourceOptions, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, } from "#src/datasource/index.js"; -import { DataSourceProvider } from "#src/datasource/index.js"; +import { getKvStorePathCompletions } from "#src/datasource/kvstore_completions.js"; import { VolumeChunkSourceParameters } from "#src/datasource/zarr/base.js"; import "#src/datasource/zarr/codec/bytes/resolve.js"; import "#src/datasource/zarr/codec/crc32c/resolve.js"; @@ -53,6 +51,16 @@ import { } from "#src/datasource/zarr/metadata/parse.js"; import type { OmeMultiscaleMetadata } from "#src/datasource/zarr/ome.js"; import { parseOmeMetadata } from "#src/datasource/zarr/ome.js"; +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { CompletionResult } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { + kvstoreEnsureDirectoryPipelineUrl, + parseUrlSuffix, + pipelineUrlJoin, +} from "#src/kvstore/url.js"; import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; import type { VolumeSourceOptions } from "#src/sliceview/volume/base.js"; import { @@ -69,27 +77,17 @@ import { applyCompletionOffset, completeQueryStringParametersFromTable, } from "#src/util/completion.js"; -import type { Borrowed } from "#src/util/disposable.js"; -import { completeHttpPath } from "#src/util/http_path_completion.js"; -import { isNotFoundError, responseJson } from "#src/util/http_request.js"; import { parseQueryStringParameters, verifyObject, verifyOptionalObjectProperty, } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; -import { getObjectId } from "#src/util/object_id.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; class ZarrVolumeChunkSource extends WithParameters( - WithCredentialsProvider()(VolumeChunkSource), + WithSharedKvStoreContext(VolumeChunkSource), VolumeChunkSourceParameters, ) {} @@ -109,11 +107,10 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } constructor( - chunkManager: Borrowed, - public credentialsProvider: SpecialProtocolCredentialsProvider, + public sharedKvStoreContext: SharedKvStoreContext, public multiscale: ZarrMultiscaleInfo, ) { - super(chunkManager); + super(sharedKvStoreContext.chunkManager); this.volumeType = VolumeType.IMAGE; } @@ -160,7 +157,7 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou chunkSource: this.chunkManager.getChunkSource( ZarrVolumeChunkSource, { - credentialsProvider: this.credentialsProvider, + sharedKvStoreContext: this.sharedKvStoreContext, spec, parameters: { url: scale.url, @@ -177,28 +174,27 @@ export class MultiscaleVolumeChunkSource extends GenericMultiscaleVolumeChunkSou } function getJsonResource( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, + description: string, + options: Partial, ): Promise { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "zarr:json", url, - credentialsProvider: getObjectId(credentialsProvider), }, - async () => { - try { - return await cancellableFetchSpecialOk( - credentialsProvider, - url, - {}, - responseJson, - ); - } catch (e) { - if (isNotFoundError(e)) return undefined; - throw e; - } + options, + async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Reading ${description} from ${url}`, + }); + const response = await sharedKvStoreContext.kvStoreContext.read( + url, + options, + ); + if (response === undefined) return undefined; + return await response.response.json(); }, ); } @@ -297,26 +293,19 @@ function getMultiscaleInfoForSingleArray( } async function resolveOmeMultiscale( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, multiscale: OmeMultiscaleMetadata, options: { explicitDimensionSeparator: DimensionSeparator | undefined; zarrVersion: 2 | 3; - }, + } & Partial, ): Promise { const scaleZarrMetadata = await Promise.all( multiscale.scales.map(async (scale) => { - const metadata = await getMetadata( - chunkManager, - credentialsProvider, - scale.url, - { - zarrVersion: options.zarrVersion, - expectedNodeType: "array", - explicitDimensionSeparator: options.explicitDimensionSeparator, - }, - ); + const metadata = await getMetadata(sharedKvStoreContext, scale.url, { + ...options, + expectedNodeType: "array", + }); if (metadata === undefined) { throw new Error( `zarr v{zarrVersion} array metadata not found at ${scale.url}`, @@ -386,19 +375,28 @@ async function resolveOmeMultiscale( } async function getMetadata( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContext, url: string, options: { zarrVersion?: 2 | 3 | undefined; expectedNodeType?: NodeType | undefined; explicitDimensionSeparator?: DimensionSeparator | undefined; - }, + } & Partial, ): Promise { if (options.zarrVersion === 2) { const [zarray, zattrs] = await Promise.all([ - getJsonResource(chunkManager, credentialsProvider, `${url}/.zarray`), - getJsonResource(chunkManager, credentialsProvider, `${url}/.zattrs`), + getJsonResource( + sharedKvStoreContext, + `${url}.zarray`, + "zarr v2 array metadata", + options, + ), + getJsonResource( + sharedKvStoreContext, + `${url}.zattrs`, + "zarr v2 attributes", + options, + ), ]); if (zarray === undefined) { if (zattrs === undefined) { @@ -424,9 +422,10 @@ async function getMetadata( } if (options.zarrVersion === 3) { const zarrJson = await getJsonResource( - chunkManager, - credentialsProvider, - `${url}/zarr.json`, + sharedKvStoreContext, + `${url}zarr.json`, + "zarr v3 metadata", + options, ); if (zarrJson === undefined) return undefined; if (options.explicitDimensionSeparator !== undefined) { @@ -437,11 +436,11 @@ async function getMetadata( return parseV3Metadata(zarrJson, options.expectedNodeType); } const [v2Result, v3Result] = await Promise.all([ - getMetadata(chunkManager, credentialsProvider, url, { + getMetadata(sharedKvStoreContext, url, { ...options, zarrVersion: 2, }), - getMetadata(chunkManager, credentialsProvider, url, { + getMetadata(sharedKvStoreContext, url, { ...options, zarrVersion: 3, }), @@ -452,49 +451,64 @@ async function getMetadata( return v2Result ?? v3Result; } -export class ZarrDataSource extends DataSourceProvider { - constructor(public zarrVersion: 2 | 3 | undefined = undefined) { - super(); +function resolveUrl(options: GetKvStoreBasedDataSourceOptions) { + const { + authorityAndPath: additionalPath, + query, + fragment, + } = parseUrlSuffix(options.url.suffix); + + if (query) { + throw new Error( + `Invalid URL ${JSON.stringify(options.url.url)}: query parameters not supported`, + ); + } + return { + kvStoreUrl: kvstoreEnsureDirectoryPipelineUrl(options.kvStoreUrl), + additionalPath: additionalPath ?? "", + fragment, + }; +} + +export class ZarrDataSource implements KvStoreBasedDataSourceProvider { + constructor(public zarrVersion: 2 | 3 | undefined = undefined) {} + get scheme() { + return `zarr${this.zarrVersion ?? ""}`; + } + get expectsDirectory() { + return true; } get description() { const versionStr = this.zarrVersion === undefined ? "" : ` v${this.zarrVersion}`; return `Zarr${versionStr} data source`; } - get(options: GetDataSourceOptions): Promise { - // Pattern is infallible. - let [, providerUrl, query] = - options.providerUrl.match(/([^?]*)(?:\?(.*))?$/)!; - const parameters = parseQueryStringParameters(query || ""); + get(options: GetKvStoreBasedDataSourceOptions): Promise { + let { kvStoreUrl, additionalPath, fragment } = resolveUrl(options); + kvStoreUrl = kvstoreEnsureDirectoryPipelineUrl( + pipelineUrlJoin(kvStoreUrl, additionalPath), + ); + const parameters = parseQueryStringParameters(fragment || ""); verifyObject(parameters); const dimensionSeparator = verifyOptionalObjectProperty( parameters, "dimension_separator", parseDimensionSeparator, ); - if (providerUrl.endsWith("/")) { - providerUrl = providerUrl.substring(0, providerUrl.length - 1); - } - return options.chunkManager.memoize.getUncounted( + return options.registry.chunkManager.memoize.getAsync( { type: "zarr:MultiscaleVolumeChunkSource", - providerUrl, + kvStoreUrl, dimensionSeparator, }, - async () => { - const { url, credentialsProvider } = parseSpecialUrl( - providerUrl, - options.credentialsManager, - ); - const metadata = await getMetadata( - options.chunkManager, - credentialsProvider, - url, - { - zarrVersion: this.zarrVersion, - explicitDimensionSeparator: dimensionSeparator, - }, - ); + options, + async (progressOptions) => { + const { sharedKvStoreContext } = options.registry; + const metadata = await getMetadata(sharedKvStoreContext, kvStoreUrl, { + ...progressOptions, + zarrVersion: this.zarrVersion, + explicitDimensionSeparator: dimensionSeparator, + }); if (metadata === undefined) { throw new Error("No zarr metadata found"); } @@ -502,31 +516,34 @@ export class ZarrDataSource extends DataSourceProvider { if (metadata.nodeType === "group") { // May be an OME-zarr multiscale dataset. const multiscale = parseOmeMetadata( - url, + kvStoreUrl, metadata.userAttributes, metadata.zarrVersion, ); if (multiscale === undefined) { - throw new Error("Neithre array nor OME multiscale metadata found"); + throw new Error("Neither array nor OME multiscale metadata found"); } multiscaleInfo = await resolveOmeMultiscale( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscale, { + ...progressOptions, zarrVersion: metadata.zarrVersion, explicitDimensionSeparator: dimensionSeparator, }, ); } else { - multiscaleInfo = getMultiscaleInfoForSingleArray(url, metadata); + multiscaleInfo = getMultiscaleInfoForSingleArray( + kvStoreUrl, + metadata, + ); } const volume = new MultiscaleVolumeChunkSource( - options.chunkManager, - credentialsProvider, + sharedKvStoreContext, multiscaleInfo, ); return { + canonicalUrl: `${kvStoreUrl}|zarr${metadata.zarrVersion}:`, modelTransform: makeIdentityTransform(volume.modelSpace), subsources: [ { @@ -550,23 +567,46 @@ export class ZarrDataSource extends DataSourceProvider { }, ); } - - async completeUrl(options: CompleteUrlOptions) { - // Pattern is infallible. - const [, , query] = options.providerUrl.match(/([^?]*)(?:\?(.*))?$/)!; - if (query !== undefined) { - return applyCompletionOffset( - options.providerUrl.length - query.length, - await completeQueryStringParametersFromTable( - query, - supportedQueryParameters, - ), - ); + async completeUrl( + options: GetKvStoreBasedDataSourceOptions, + ): Promise { + const { kvStoreUrl, additionalPath, fragment } = resolveUrl(options); + if (fragment === undefined) { + return getKvStorePathCompletions(options.registry.sharedKvStoreContext, { + baseUrl: kvStoreUrl, + path: additionalPath, + directoryOnly: true, + signal: options.signal, + progressListener: options.progressListener, + }); + } + if (this.zarrVersion === 3) { + throw new Error("URL fragment parameters not supported"); } - return await completeHttpPath( - options.credentialsManager, - options.providerUrl, - options.cancellationToken, + return applyCompletionOffset( + options.url.url.length - fragment.length, + await completeQueryStringParametersFromTable( + fragment, + supportedQueryParameters, + ), ); } } + +export function registerAutoDetectV2(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set([".zarray", ".zattrs"]), { + suffix: "zarr2:", + description: "Zarr v2 data source", + }), + ); +} + +export function registerAutoDetectV3(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["zarr.json"]), { + suffix: "zarr3:", + description: "Zarr v3 data source", + }), + ); +} diff --git a/src/datasource/zarr/index.rst b/src/datasource/zarr/index.rst new file mode 100644 index 0000000000..cd25bd7c01 --- /dev/null +++ b/src/datasource/zarr/index.rst @@ -0,0 +1,107 @@ +.. _zarr-datasource: + +zarr +==== + +The Zarr :ref:`data format driver` provides access to `Zarr +version 2 `__ and +`Zarr version 3 +`__ arrays, and +`OME-Zarr multiscale +`__ v4.0 and +v5.0 arrays. + +URL syntax +---------- + +- :file:`{KVSTORE-URL/}|zarr:` (auto-detect zarr version) +- :file:`{KVSTORE-URL/}|zarr2:` (v2 only) +- :file:`{KVSTORE-URL/}|zarr3:` (v3 only) +- :file:`{KVSTORE-URL/}|zarr:{additional/path/}` +- :file:`{KVSTORE-URL/}|zarr2:{additional/path/}` +- :file:`{KVSTORE-URL/}|zarr3:{additional/path/}` +- :file:`{KVSTORE-URL/}|zarr:#dimension_separator=/` +- :file:`{KVSTORE-URL/}|zarr2:#dimension_separator=/` + +Specifying an :file:`{additional/path/}` after the zarr URL scheme is currently +equivalent to including it in the :file:`{KVSTORE-URL/}`, but may be +preferred for distinguishing the root of a zarr hierarchy from the path within +it, and may be necessary to support group-level storage transformers which may +be added to the specification in the future. + +For zarr v2 only, if a dimension separator of ``/`` is used but not indicated in +the metadata, it must be specified using the :file:`#dimension_separator=/` +syntax. + +The :file:`{KVSTORE-URL/}` must refer to a directory, and the combination +of :file:`{KVSTORE-URL/}` and any :file:`{additional/path/}` after the zarr +URL scheme must specify either a Zarr array or a Zarr group with OME-Zarr +multiscale metadata. + +Data types +---------- + +Supported data types: + +- uint8 +- int8 +- uint16 +- int16 +- uint32 +- int32 +- uint64 +- float32 + +Coordinate spaces +----------------- + +Units specified by OME-Zarr multiscale metadata are supported. + +Additionally, as a Neuroglancer-specific extension, dimension units may be +specified using the ``dimension_units`` user attribute. For example, to specify +that the voxel size is 4x5x30nm for a 3-d array, the following attribute may be +set: + +.. code-block:: json + + { + "dimension_units": ["4 nm", "5 nm", "30 nm"] + } + +Zarr v2 features +---------------- + +Supported compressors: + +- blosc +- gzip +- null (raw) +- zlib +- zstd + +Filters are not supported. + +Dimension names may be specified using an ``_ARRAY_DIMENSIONS`` attribute, `as +defined by xarray +`__. + +Zarr v3 features +---------------- + +Supported codecs: + +- crc32c (not validated) +- blosc +- bytes +- gzip +- sharding_indexed +- transpose +- zstd + +Auto detection +-------------- + +- Zarr v2 is detected automatically based on the presence of the :file:`.zarray` + and :file:`.zattrs` files. +- Zarr v3 is detected automatically based on the presence of the + :file:`zarr.json` file. diff --git a/src/datasource/zarr/metadata/parse.ts b/src/datasource/zarr/metadata/parse.ts index af158972b5..3af2732fe0 100644 --- a/src/datasource/zarr/metadata/parse.ts +++ b/src/datasource/zarr/metadata/parse.ts @@ -77,7 +77,7 @@ const UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision + // eslint-disable-next-line no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], @@ -396,16 +396,9 @@ export function parseV2Metadata( break; case "zlib": case "gzip": - codecs.push({ - name: "gzip", - configuration: { - level: verifyObjectProperty(compressor, "level", verifyInt), - }, - }); - break; case "zstd": codecs.push({ - name: "zstd", + name: id, configuration: { level: verifyObjectProperty(compressor, "level", verifyInt), }, diff --git a/src/datasource/zarr/ome.ts b/src/datasource/zarr/ome.ts index ed1adf7979..e3f049af56 100644 --- a/src/datasource/zarr/ome.ts +++ b/src/datasource/zarr/ome.ts @@ -46,7 +46,7 @@ const OME_UNITS = new Map([ ["foot", { unit: "m", scale: 0.3048 }], ["inch", { unit: "m", scale: 0.0254 }], ["mile", { unit: "m", scale: 1609.34 }], - // eslint-disable-next-line @typescript-eslint/no-loss-of-precision + // eslint-disable-next-line no-loss-of-precision ["parsec", { unit: "m", scale: 3.0856775814913673e16 }], ["yard", { unit: "m", scale: 0.9144 }], ["minute", { unit: "s", scale: 60 }], @@ -138,7 +138,7 @@ const coordinateTransformParsers = new Map([ function parseOmeCoordinateTransform( rank: number, transformJson: unknown, -): Float64Array { +): Float64Array { verifyObject(transformJson); const transformType = verifyObjectProperty( transformJson, @@ -163,7 +163,7 @@ function parseOmeCoordinateTransforms( parseArray(transforms, (transformJson) => { const newTransform = parseOmeCoordinateTransform(rank, transformJson); transform = matrix.multiply( - new Float64Array(transform.length), + new Float64Array(transform.length) as Float64Array, rank + 1, newTransform, rank + 1, @@ -188,7 +188,7 @@ function parseMultiscaleScale( "coordinateTransformations", (x) => parseOmeCoordinateTransforms(rank, x), ); - const scaleUrl = `${url}/${path}`; + const scaleUrl = `${url}${path}/`; return { url: scaleUrl, transform }; } @@ -211,7 +211,7 @@ function parseOmeMultiscale( parseArray(obj, (x) => { const scale = parseMultiscaleScale(rank, url, x); scale.transform = matrix.multiply( - new Float64Array((rank + 1) ** 2), + new Float64Array((rank + 1) ** 2) as Float64Array, rank + 1, transform, rank + 1, diff --git a/src/datasource/zarr/register_default.ts b/src/datasource/zarr/register_default.ts index 7046d2bc82..a1813881b7 100644 --- a/src/datasource/zarr/register_default.ts +++ b/src/datasource/zarr/register_default.ts @@ -14,9 +14,25 @@ * limitations under the License. */ -import { registerProvider } from "#src/datasource/default_provider.js"; -import { ZarrDataSource } from "#src/datasource/zarr/frontend.js"; +import { + registerKvStoreBasedDataProvider, + dataSourceAutoDetectRegistry, + registerProvider, +} from "#src/datasource/default_provider.js"; +import { KvStoreBasedDataSourceLegacyUrlAdapter } from "#src/datasource/index.js"; +import { + ZarrDataSource, + registerAutoDetectV2, + registerAutoDetectV3, +} from "#src/datasource/zarr/frontend.js"; -registerProvider("zarr", () => new ZarrDataSource()); -registerProvider("zarr2", () => new ZarrDataSource(2)); -registerProvider("zarr3", () => new ZarrDataSource(3)); +for (const provider of [ + new ZarrDataSource(), + new ZarrDataSource(2), + new ZarrDataSource(3), +]) { + registerKvStoreBasedDataProvider(provider); + registerProvider(new KvStoreBasedDataSourceLegacyUrlAdapter(provider)); +} +registerAutoDetectV2(dataSourceAutoDetectRegistry); +registerAutoDetectV3(dataSourceAutoDetectRegistry); diff --git a/src/display_context.ts b/src/display_context.ts index 0438391f57..7887f714b6 100644 --- a/src/display_context.ts +++ b/src/display_context.ts @@ -25,6 +25,10 @@ import { FramerateMonitor } from "#src/util/framerate.js"; import type { mat4 } from "#src/util/geom.js"; import { parseFixedLengthArray, verifyFloat01 } from "#src/util/json.js"; import { NullarySignal } from "#src/util/signal.js"; +import { + TrackableScreenshotMode, + ScreenshotMode, +} from "#src/util/trackable_screenshot_mode.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; import type { GL } from "#src/webgl/context.js"; import { initializeWebGL } from "#src/webgl/context.js"; @@ -115,7 +119,7 @@ export abstract class RenderedPanel extends RefCounted { renderViewport = new RenderViewport(); - private monitorState: PanelMonitorState = {}; + private monitorState: PanelMonitorState = { isIntersecting: true }; constructor( public context: Borrowed, @@ -135,7 +139,7 @@ export abstract class RenderedPanel extends RefCounted { abstract isReady(): boolean; - ensureBoundsUpdated() { + ensureBoundsUpdated(canScaleForScreenshot: boolean = false) { const { context } = this; context.ensureBoundsUpdated(); const { boundsGeneration } = context; @@ -221,8 +225,18 @@ export abstract class RenderedPanel extends RefCounted { 0, clippedBottom - clippedTop, )); - viewport.logicalWidth = logicalWidth; - viewport.logicalHeight = logicalHeight; + if ( + this.context.screenshotMode.value !== ScreenshotMode.OFF && + canScaleForScreenshot + ) { + viewport.width = logicalWidth * screenToCanvasPixelScaleX; + viewport.height = logicalHeight * screenToCanvasPixelScaleY; + viewport.logicalWidth = logicalWidth * screenToCanvasPixelScaleX; + viewport.logicalHeight = logicalHeight * screenToCanvasPixelScaleY; + } else { + viewport.logicalWidth = logicalWidth; + viewport.logicalHeight = logicalHeight; + } viewport.visibleLeftFraction = (clippedLeft - logicalLeft) / logicalWidth; viewport.visibleTopFraction = (clippedTop - logicalTop) / logicalHeight; viewport.visibleWidthFraction = clippedWidth / logicalWidth; @@ -386,6 +400,13 @@ interface PanelMonitorState { // detections due to normalization that the browser may do. intersectionObserverMargin?: string; + // Indicates that the element is intersecting the viewport at all. If `true`, + // then the intersection observer margin is set normally to detect any + // changes. If `false`, then the intersection observer margin is set to cover + // the entire viewport in order to detect when the panel becomes visible + // again. + isIntersecting: boolean; + // Indicates that the panel element was added to the resize observer. addedToResizeObserver?: boolean; } @@ -403,6 +424,9 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { rootRect: DOMRect | undefined; resizeGeneration = 0; boundsGeneration = -1; + screenshotMode: TrackableScreenshotMode = new TrackableScreenshotMode( + ScreenshotMode.OFF, + ); force3DHistogramForAutoRange = false; private framerateMonitor = new FramerateMonitor(); @@ -430,21 +454,37 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { this.resizeObserver.observe(element); state.addedToResizeObserver = true; } - const rootRect = this.rootRect!; - const marginTop = rootRect.top - elementClientRect.top; - const marginLeft = rootRect.left - elementClientRect.left; - const marginRight = elementClientRect.right - rootRect.right; - const marginBottom = elementClientRect.bottom - rootRect.bottom; - const margin = `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`; + let margin: string; + if (state.isIntersecting) { + const rootRect = this.rootRect!; + const marginTop = rootRect.top - elementClientRect.top; + const marginLeft = rootRect.left - elementClientRect.left; + const marginRight = elementClientRect.right - rootRect.right; + const marginBottom = elementClientRect.bottom - rootRect.bottom; + margin = `${marginTop}px ${marginRight}px ${marginBottom}px ${marginLeft}px`; + } else { + margin = ""; + } if (state.intersectionObserverMargin !== margin) { state.intersectionObserverMargin = margin; state.intersectionObserver?.disconnect(); + const thresholds = new Array(101); + for (let i = 0; i <= 100; ++i) { + thresholds[i] = 0.01 * i; + } const intersectionObserver = (state.intersectionObserver = - new IntersectionObserver(this.resizeCallback, { - root: this.container, - rootMargin: margin, - threshold: [0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1], - })); + new IntersectionObserver( + (entries) => { + const lastEntry = entries[entries.length - 1]; + state.isIntersecting = lastEntry.isIntersecting; + this.resizeCallback(); + }, + { + root: this.container, + rootMargin: margin, + threshold: thresholds, + }, + )); intersectionObserver.observe(element); } } @@ -576,8 +616,10 @@ export class DisplayContext extends RefCounted implements FrameNumberCounter { const { resizeGeneration } = this; if (this.boundsGeneration === resizeGeneration) return; const { canvas } = this; - canvas.width = canvas.offsetWidth; - canvas.height = canvas.offsetHeight; + if (this.screenshotMode.value === ScreenshotMode.OFF) { + canvas.width = canvas.offsetWidth; + canvas.height = canvas.offsetHeight; + } this.canvasRect = canvas.getBoundingClientRect(); this.rootRect = this.container.getBoundingClientRect(); this.boundsGeneration = resizeGeneration; diff --git a/src/gpu_hash/hash_table.ts b/src/gpu_hash/hash_table.ts index e80c41f536..122de83e86 100644 --- a/src/gpu_hash/hash_table.ts +++ b/src/gpu_hash/hash_table.ts @@ -47,7 +47,7 @@ export abstract class HashTableBase { /** * Number of uint32 elements per entry in hash table. */ - entryStride: number; + declare entryStride: number; generation = 0; diff --git a/src/gpu_hash/shader.ts b/src/gpu_hash/shader.ts index 39dbd75681..af44a0b97b 100644 --- a/src/gpu_hash/shader.ts +++ b/src/gpu_hash/shader.ts @@ -98,19 +98,26 @@ export class GPUHashTable extends RefCounted { } export class HashSetShaderManager { - textureUnitSymbol = Symbol.for(`gpuhashtable:${this.prefix}`); - private accessHelper = new OneDimensionalTextureAccessHelper( - `gpuhashtable_${this.prefix}`, - ); - samplerName = this.prefix + "_sampler"; - hashSeedsName = this.prefix + "_seeds"; - hashKeyMask = this.prefix + "_keyMask"; - readTable = this.prefix + "_readTable"; + textureUnitSymbol: symbol; + private accessHelper: OneDimensionalTextureAccessHelper; + samplerName: string; + hashSeedsName: string; + hashKeyMask: string; + readTable: string; constructor( public prefix: string, public numAlternatives = NUM_ALTERNATIVES, - ) {} + ) { + this.textureUnitSymbol = Symbol.for(`gpuhashtable:${this.prefix}`); + this.accessHelper = new OneDimensionalTextureAccessHelper( + `gpuhashtable_${this.prefix}`, + ); + this.samplerName = prefix + "_sampler"; + this.hashSeedsName = prefix + "_seeds"; + this.hashKeyMask = prefix + "_keyMask"; + this.readTable = prefix + "_readTable"; + } defineShader(builder: ShaderBuilder) { const { hashSeedsName, samplerName, numAlternatives, hashKeyMask } = this; diff --git a/src/kvstore/auto_detect.ts b/src/kvstore/auto_detect.ts new file mode 100644 index 0000000000..277c06709c --- /dev/null +++ b/src/kvstore/auto_detect.ts @@ -0,0 +1,281 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreContext } from "#src/kvstore/context.js"; +import { readKvStore } from "#src/kvstore/index.js"; +import { pathIsDirectory } from "#src/kvstore/url.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export interface AutoDetectDirectoryOptions { + url: string; + fileNames: Set; + subDirectories: Set; + signal?: AbortSignal; +} + +export interface AutoDetectMatch { + suffix: string; + description: string; +} + +export interface AutoDetectDirectorySpec { + fileNames?: Set; + subDirectories?: Set; + match: (options: AutoDetectDirectoryOptions) => Promise; +} + +export function simpleFilePresenceAutoDetectDirectorySpec( + fileNames: Set, + match: AutoDetectMatch, +): AutoDetectDirectorySpec { + return { + fileNames, + match: async (options) => { + const detectedFileNames = options.fileNames; + for (const fileName of fileNames) { + if (detectedFileNames.has(fileName)) { + return [match]; + } + } + return []; + }, + }; +} + +export interface AutoDetectFileOptions { + url: string; + prefix: Uint8Array; + suffix?: Uint8Array; + totalSize: number | undefined; + signal?: AbortSignal; +} + +export interface AutoDetectFileSpec { + prefixLength: number; + suffixLength: number; + match: (options: AutoDetectFileOptions) => Promise; +} + +function composeMatchFunctions( + specs: { + match: (options: Options) => Promise; + }[], +): (options: Options) => Promise { + return async (options: Options) => { + const matches: AutoDetectMatch[] = []; + const results = await Promise.allSettled( + specs.map((spec) => spec.match(options)), + ); + for (const result of results) { + if (result.status !== "fulfilled") continue; + matches.push(...result.value); + } + return matches; + }; +} + +export function composeAutoDetectDirectorySpecs( + specs: AutoDetectDirectorySpec[], +): AutoDetectDirectorySpec { + const fileNames = new Set(); + const subDirectories = new Set(); + for (const spec of specs) { + const { fileNames: curFileNames, subDirectories: curSubDirectories } = spec; + if (curFileNames !== undefined) { + for (const fileName of curFileNames) { + fileNames.add(fileName); + } + } + if (curSubDirectories !== undefined) { + for (const subDirectory of curSubDirectories) { + subDirectories.add(subDirectory); + } + } + } + return { fileNames, subDirectories, match: composeMatchFunctions(specs) }; +} + +export function composeAutoDetectFileSpecs( + specs: AutoDetectFileSpec[], +): AutoDetectFileSpec { + let prefixLength = 0; + let suffixLength = 0; + for (const spec of specs) { + prefixLength = Math.max(prefixLength, spec.prefixLength); + suffixLength = Math.max(suffixLength, spec.suffixLength); + } + return { prefixLength, suffixLength, match: composeMatchFunctions(specs) }; +} + +export class AutoDetectRegistry { + directorySpecs: AutoDetectDirectorySpec[] = []; + fileSpecs: AutoDetectFileSpec[] = []; + private _directorySpec: AutoDetectDirectorySpec | undefined; + private _fileSpec: AutoDetectFileSpec | undefined; + + registerDirectoryFormat(spec: AutoDetectDirectorySpec) { + this.directorySpecs.push(spec); + this._directorySpec = undefined; + } + + registerFileFormat(spec: AutoDetectFileSpec) { + this.fileSpecs.push(spec); + this._fileSpec = undefined; + } + + copyTo(registry: AutoDetectRegistry) { + registry.directorySpecs.push(...this.directorySpecs); + registry.fileSpecs.push(...this.fileSpecs); + registry._fileSpec = undefined; + registry._directorySpec = undefined; + } + + get directorySpec() { + return ( + this._directorySpec ?? (this._directorySpec = this.getDirectorySpec()) + ); + } + + private getDirectorySpec() { + return composeAutoDetectDirectorySpecs(this.directorySpecs); + } + + get fileSpec() { + return this._fileSpec ?? (this._fileSpec = this.getFileSpec()); + } + + private getFileSpec() { + const { fileSpecs } = this; + const specs = [...fileSpecs]; + return composeAutoDetectFileSpecs(specs); + } +} + +export interface AutoDetectFormatOptions extends Partial { + kvStoreContext: KvStoreContext; + url: string; + autoDetectDirectory: () => AutoDetectDirectorySpec; + autoDetectFile: () => AutoDetectFileSpec; +} + +export async function autoDetectFormat( + options: AutoDetectFormatOptions, +): Promise<{ matches: AutoDetectMatch[]; url: string }> { + const kvStore = options.kvStoreContext.getKvStore(options.url); + const { progressListener } = options; + using _span = + progressListener && + new ProgressSpan(progressListener, { + message: `Auto-detecting data format at ${options.url}`, + }); + if (!pathIsDirectory(kvStore.path) || kvStore.store.singleKey === true) { + const statResponse = await kvStore.store.stat(kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + }); + if (statResponse !== undefined) { + // Match as file. + const autoDetectFile = options.autoDetectFile(); + const { totalSize } = statResponse; + let prefix: Uint8Array; + let suffix: Uint8Array | undefined; + if (totalSize !== undefined && autoDetectFile.suffixLength > 0) { + if ( + totalSize <= + autoDetectFile.prefixLength + autoDetectFile.suffixLength + ) { + // Perform a single read + const readResponse = await readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + }); + prefix = suffix = new Uint8Array( + await readResponse.response.arrayBuffer(), + ); + } else { + [prefix, suffix] = await Promise.all( + [ + { offset: 0, length: autoDetectFile.prefixLength }, + { + offset: totalSize - autoDetectFile.suffixLength, + length: autoDetectFile.suffixLength, + }, + ].map((byteRange) => + readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + byteRange, + }) + .then((readResponse) => readResponse.response.arrayBuffer()) + .then((arrayBuffer) => new Uint8Array(arrayBuffer)), + ), + ); + } + } else { + prefix = new Uint8Array( + await ( + await readKvStore(kvStore.store, kvStore.path, { + signal: options.signal, + progressListener: options.progressListener, + throwIfMissing: true, + byteRange: { offset: 0, length: autoDetectFile.prefixLength }, + }) + ).response.arrayBuffer(), + ); + } + return { + matches: await autoDetectFile.match({ + url: options.url, + prefix, + suffix, + totalSize, + signal: options.signal, + }), + url: options.url, + }; + } + + if (kvStore.store.singleKey === true) { + return { matches: [], url: options.url }; + } + kvStore.path += "/"; + } + + const autoDetectDirectory = options.autoDetectDirectory(); + const detectedFileNames = new Set(); + await Promise.all( + Array.from(autoDetectDirectory.fileNames ?? [], async (fileName) => { + const response = await kvStore.store.stat(kvStore.path + fileName, { + signal: options.signal, + progressListener: options.progressListener, + }); + if (response !== undefined) { + detectedFileNames.add(fileName); + } + }), + ); + const url = kvStore.store.getUrl(kvStore.path); + const matches = await autoDetectDirectory.match({ + url, + fileNames: detectedFileNames, + subDirectories: new Set(), + signal: options.signal, + }); + return { matches, url }; +} diff --git a/src/kvstore/backend.ts b/src/kvstore/backend.ts new file mode 100644 index 0000000000..34b11f5b0d --- /dev/null +++ b/src/kvstore/backend.ts @@ -0,0 +1,65 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/credentials_provider/shared_counterpart.js"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import type { SharedCredentialsManagerCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import { KvStoreContext } from "#src/kvstore/context.js"; +import { + frontendBackendIsomorphicKvStoreProviderRegistry, + KvStoreProviderRegistry, +} from "#src/kvstore/register.js"; +import { SHARED_KVSTORE_CONTEXT_RPC_ID } from "#src/kvstore/shared_common.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { + registerSharedObject, + SharedObjectCounterpart, +} from "#src/worker_rpc.js"; + +@registerSharedObject(SHARED_KVSTORE_CONTEXT_RPC_ID) +export class SharedKvStoreContextCounterpart extends SharedObjectCounterpart { + kvStoreContext: KvStoreContext; + + chunkManager: ChunkManager; + credentialsManager: SharedCredentialsManagerCounterpart; + + constructor(rpc: RPC, options: any) { + super(rpc, options); + this.chunkManager = rpc.get(options.chunkManager) as ChunkManager; + this.credentialsManager = rpc.get( + options.credentialsManager, + ) as SharedCredentialsManagerCounterpart; + this.kvStoreContext = new KvStoreContext(); + frontendBackendIsomorphicKvStoreProviderRegistry.applyToContext(this); + backendOnlyKvStoreProviderRegistry.applyToContext(this); + } +} + +export const backendOnlyKvStoreProviderRegistry = + new KvStoreProviderRegistry(); + +export function WithSharedKvStoreContextCounterpart< + TBase extends { new (...args: any[]): SharedObjectCounterpart }, +>(Base: TBase) { + return class extends Base { + sharedKvStoreContext: SharedKvStoreContextCounterpart; + constructor(...args: any[]) { + super(...args); + const options = args[1]; + this.sharedKvStoreContext = this.rpc!.get(options.sharedKvStoreContext); + } + }; +} diff --git a/src/kvstore/byte_range/file_handle.ts b/src/kvstore/byte_range/file_handle.ts new file mode 100644 index 0000000000..afc690accc --- /dev/null +++ b/src/kvstore/byte_range/file_handle.ts @@ -0,0 +1,109 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + ByteRange, + ByteRangeRequest, + DriverReadOptions, + FileHandle, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { readFileHandle } from "#src/kvstore/index.js"; + +export function composeByteRangeRequest( + outer: ByteRange, + inner: ByteRangeRequest | undefined, +): { outer: ByteRange; inner: ByteRange } { + if (inner === undefined) { + return { outer, inner: { offset: 0, length: outer.length } }; + } + if ("suffixLength" in inner) { + const length = Math.min(outer.length, inner.suffixLength); + return { + outer: { offset: outer.offset + (outer.length - length), length }, + inner: { offset: outer.length - length, length }, + }; + } + if (inner.offset + inner.length > outer.length) { + throw new Error( + `Requested byte range ${JSON.stringify( + inner, + )} not valid for value of length ${outer.length}`, + ); + } + return { + outer: { offset: outer.offset + inner.offset, length: inner.length }, + inner, + }; +} + +export function handleByteRangeRequestFromUint8Array( + value: Uint8Array, + byteRange: ByteRangeRequest | undefined, +): ReadResponse { + const { + outer: { offset, length }, + } = composeByteRangeRequest({ offset: 0, length: value.length }, byteRange); + return { + offset, + length, + totalSize: value.length, + response: new Response(value.subarray(offset, offset + length)), + }; +} + +export class FileByteRangeHandle implements FileHandle { + constructor( + public base: FileHandle, + public byteRange: ByteRange, + ) {} + + async stat(options: StatOptions): Promise { + options; + return { totalSize: this.byteRange.length }; + } + + async read(options: DriverReadOptions): Promise { + const { byteRange } = this; + const { outer: outerByteRange, inner: innerByteRange } = + composeByteRangeRequest(byteRange, options.byteRange); + if (outerByteRange.length === 0) { + return { + response: new Response(new Uint8Array(0)), + totalSize: byteRange.length, + ...innerByteRange, + }; + } + const response = await readFileHandle(this.base, { + signal: options.signal, + byteRange: outerByteRange, + strictByteRange: true, + throwIfMissing: true, + }); + return { + response: response.response, + totalSize: byteRange.length, + ...innerByteRange, + }; + } + + getUrl() { + const { offset, length } = this.byteRange; + return `${this.base.getUrl()}|range:${offset}-${offset + length}`; + } +} diff --git a/src/kvstore/byte_range/index.rst b/src/kvstore/byte_range/index.rst new file mode 100644 index 0000000000..3187c462ea --- /dev/null +++ b/src/kvstore/byte_range/index.rst @@ -0,0 +1,37 @@ +.. _byte-range-kvstore: + +Byte range +========== + +The byte range :ref:`key-value store adapter` allows an +individual byte range within a file to be specified. + +URL syntax +---------- + +- :file:`{base-kvstore-url}|byte-range:{start}-{end}` + +The :file:`{base-kvstore-url}` must refer to a file. The :file:`{start}` bound +is inclusive, while the :file:`{end}` bound is exclusive; the total length is +``end - start``. + +For example: + +- ``gs://bucket/path/to/data|byte-range:1000-2000`` + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported. + * - :ref:`kvstore-listing` + - Not applicable. + +.. list-table:: Required capabilities of base key-value store + + * - :ref:`kvstore-byte-range-reads` + - Required. + * - :ref:`kvstore-listing` + - Not needed. diff --git a/src/kvstore/byte_range/index.ts b/src/kvstore/byte_range/index.ts new file mode 100644 index 0000000000..93c9ae606e --- /dev/null +++ b/src/kvstore/byte_range/index.ts @@ -0,0 +1,75 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import type { + DriverReadOptions, + KvStore, + ReadResponse, + StatOptions, + StatResponse, + FileHandle, + ByteRange, +} from "#src/kvstore/index.js"; + +function parseKey(key: string): ByteRange { + const m = key.match(/^([0-9]+)-([0-9]+)$/); + if (m !== null) { + const begin = Number(m[1]); + const end = Number(m[2]); + if (end >= begin) { + return { offset: begin, length: end - begin }; + } + } + throw new Error( + `Invalid key ${JSON.stringify(key)} for "byte-range:", expected "-"`, + ); +} + +export class ByteRangeKvStore implements KvStore { + constructor(public base: FileHandle) {} + + getUrl(key: string) { + return this.base.getUrl() + `|byte-range:${key}`; + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const { length } = parseKey(key); + options; + return { totalSize: length }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const byteRange = parseKey(key); + return new FileByteRangeHandle(this.base, byteRange).read(options); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } + get singleKey() { + return true; + } +} diff --git a/src/kvstore/byte_range/register.ts b/src/kvstore/byte_range/register.ts new file mode 100644 index 0000000000..4bdacc9f70 --- /dev/null +++ b/src/kvstore/byte_range/register.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ByteRangeKvStore } from "#src/kvstore/byte_range/index.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; + +function byteRangeProvider(): KvStoreAdapterProvider { + return { + scheme: "byte-range", + description: `byte range slicing`, + getKvStore(url, base) { + ensureNoQueryOrFragmentParameters(url); + return { + store: new ByteRangeKvStore( + new KvStoreFileHandle(base.store, base.path), + ), + path: url.suffix ?? "", + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerKvStoreAdapterProvider( + byteRangeProvider, +); diff --git a/src/kvstore/chunk_source_frontend.ts b/src/kvstore/chunk_source_frontend.ts new file mode 100644 index 0000000000..a626923c12 --- /dev/null +++ b/src/kvstore/chunk_source_frontend.ts @@ -0,0 +1,55 @@ +/** + * @license + * Copyright 2017 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @file Facilities to simplify defining subclasses of ChunkSource that use a CredentialsProvider. + */ + +import type { + ChunkManager, + ChunkSourceConstructor, + GettableChunkSource, +} from "#src/chunk_manager/frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { RPC } from "#src/worker_rpc.js"; + +/** + * Mixin for adding a credentialsProvider member to a ChunkSource. + */ +export function WithSharedKvStoreContext< + TBase extends ChunkSourceConstructor< + GettableChunkSource & { chunkManager: ChunkManager } + >, +>(Base: TBase) { + type WithSharedKvStoreContextOptions = InstanceType["OPTIONS"] & { + sharedKvStoreContext: SharedKvStoreContext; + }; + class C extends Base { + sharedKvStoreContext: SharedKvStoreContext; + declare OPTIONS: WithSharedKvStoreContextOptions; + constructor(...args: any[]) { + super(...args); + const options: WithSharedKvStoreContextOptions = args[1]; + this.sharedKvStoreContext = options.sharedKvStoreContext.addRef(); + } + initializeCounterpart(rpc: RPC, options: any) { + const { sharedKvStoreContext } = this; + options.sharedKvStoreContext = sharedKvStoreContext.rpcId; + super.initializeCounterpart(rpc, options); + } + } + return C; +} diff --git a/src/kvstore/context.ts b/src/kvstore/context.ts new file mode 100644 index 0000000000..b3d4b7923d --- /dev/null +++ b/src/kvstore/context.ts @@ -0,0 +1,185 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { + KvStoreWithPath, + ListResponse, + ReadResponse, + ReadOptions, + ListOptions, + StatOptions, + StatResponse, + FileHandle, +} from "#src/kvstore/index.js"; +import { + KvStoreFileHandle, + listKvStore, + readKvStore, +} from "#src/kvstore/index.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { resolveRelativePath, splitPipelineUrl } from "#src/kvstore/url.js"; +import type { + BasicCompletionResult, + CompletionWithDescription, +} from "#src/util/completion.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export type CompletionResult = BasicCompletionResult; + +export interface BaseKvStoreProvider { + scheme: string; + hidden?: boolean; + description?: string; + getKvStore(parsedUrl: UrlWithParsedScheme): KvStoreWithPath; + completeUrl?: ( + options: BaseKvStoreCompleteUrlOptions, + ) => Promise; +} + +export interface BaseKvStoreCompleteUrlOptions + extends Partial { + url: UrlWithParsedScheme; +} + +export interface KvStoreAdapterProvider { + scheme: string; + hidden?: boolean; + description?: string; + getKvStore( + parsedUrl: UrlWithParsedScheme, + base: KvStoreWithPath, + ): KvStoreWithPath; + completeUrl?: ( + options: KvStoreAdapterCompleteUrlOptions, + ) => Promise; +} + +export interface KvStoreAdapterCompleteUrlOptions + extends Partial { + url: UrlWithParsedScheme; + base: KvStoreWithPath; +} + +export class KvStoreContext { + baseKvStoreProviders = new Map(); + kvStoreAdapterProviders = new Map(); + autoDetectRegistry = new AutoDetectRegistry(); + + getKvStore(url: string): KvStoreWithPath { + const pipeline = splitPipelineUrl(url); + let kvStore: KvStoreWithPath; + { + const basePart = pipeline[0]; + kvStore = this.getBaseKvStoreProvider(basePart).getKvStore(basePart); + } + for (let i = 1; i < pipeline.length; ++i) { + kvStore = this.applyKvStoreAdapterUrl(kvStore, pipeline[i]); + } + return kvStore; + } + + getFileHandle(url: string): FileHandle { + const { store, path } = this.getKvStore(url); + return new KvStoreFileHandle(store, path); + } + + getBaseKvStoreProvider(url: UrlWithParsedScheme): BaseKvStoreProvider { + const provider = this.baseKvStoreProviders.get(url.scheme); + if (provider === undefined) { + const usage = this.describeProtocolUsage(url.scheme); + let message = `Invalid base kvstore protocol "${url.scheme}:"`; + if (usage !== undefined) { + message += `; ${usage}`; + } + throw new Error(message); + } + return provider; + } + + getKvStoreAdapterProvider( + adapterUrl: UrlWithParsedScheme, + ): KvStoreAdapterProvider { + const provider = this.kvStoreAdapterProviders.get(adapterUrl.scheme); + if (provider === undefined) { + const usage = this.describeProtocolUsage(adapterUrl.scheme); + let message = `Invalid kvstore adapter protocol "${adapterUrl.scheme}:"`; + if (usage !== undefined) { + message += `; ${usage}`; + } + message += `; supported schemes: ${JSON.stringify(Array.from(this.kvStoreAdapterProviders.keys()))}`; + throw new Error(message); + } + return provider; + } + + applyKvStoreAdapterUrl( + base: KvStoreWithPath, + adapterUrl: UrlWithParsedScheme, + ): KvStoreWithPath { + return this.getKvStoreAdapterProvider(adapterUrl).getKvStore( + adapterUrl, + base, + ); + } + + // Describes valid uses of `protocol`, for error messages indicating an + // invalid protocol. If the protocol is unknown, returns `undefined`. + describeProtocolUsage(protocol: string): string | undefined { + if (this.baseKvStoreProviders.has(protocol)) { + return `"${protocol}:" may only be used as a base kvstore protocol`; + } + if (this.kvStoreAdapterProviders.has(protocol)) { + return `"${protocol}:" may only be used as a kvstore adapter protocol`; + } + return undefined; + } + + stat( + url: string, + options: StatOptions = {}, + ): Promise { + const kvStore = this.getKvStore(url); + return kvStore.store.stat(kvStore.path, options); + } + + read( + url: string, + options: ReadOptions & { throwIfMissing: true }, + ): Promise; + + read(url: string, options?: ReadOptions): Promise; + + read( + url: string, + options: ReadOptions = {}, + ): Promise { + const kvStore = this.getKvStore(url); + return readKvStore(kvStore.store, kvStore.path, options); + } + + list(urlPrefix: string, options: ListOptions = {}): Promise { + const kvStore = this.getKvStore(urlPrefix); + return listKvStore(kvStore.store, kvStore.path, options); + } + + resolveRelativePath(baseUrl: string, relativePath: string): string { + const kvStore = this.getKvStore(baseUrl); + return kvStore.store.getUrl( + resolveRelativePath(kvStore.path, relativePath), + ); + } +} diff --git a/src/kvstore/enabled_async_computation_modules.ts b/src/kvstore/enabled_async_computation_modules.ts new file mode 100644 index 0000000000..6834e964cf --- /dev/null +++ b/src/kvstore/enabled_async_computation_modules.ts @@ -0,0 +1,3 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#kvstore/icechunk/async_computation"; +import "#kvstore/ocdbt/async_computation"; diff --git a/src/kvstore/enabled_backend_modules.ts b/src/kvstore/enabled_backend_modules.ts new file mode 100644 index 0000000000..335031dc7d --- /dev/null +++ b/src/kvstore/enabled_backend_modules.ts @@ -0,0 +1,11 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#kvstore/byte_range/register"; +import "#kvstore/gcs/register"; +import "#kvstore/gzip/register"; +import "#kvstore/http/register_backend"; +import "#kvstore/icechunk/register_backend"; +import "#kvstore/middleauth/register_backend"; +import "#kvstore/ngauth/register"; +import "#kvstore/ocdbt/register_backend"; +import "#kvstore/s3/register_backend"; +import "#kvstore/zip/register_backend"; diff --git a/src/kvstore/enabled_frontend_modules.ts b/src/kvstore/enabled_frontend_modules.ts new file mode 100644 index 0000000000..476e2f6d1d --- /dev/null +++ b/src/kvstore/enabled_frontend_modules.ts @@ -0,0 +1,13 @@ +// DO NOT EDIT: Generated by config/update_conditions.ts +import "#kvstore/byte_range/register"; +import "#kvstore/gcs/register"; +import "#kvstore/gzip/register"; +import "#kvstore/http/register_frontend"; +import "#kvstore/icechunk/register_frontend"; +import "#kvstore/middleauth/register_frontend"; +import "#kvstore/middleauth/register_credentials_provider"; +import "#kvstore/ngauth/register"; +import "#kvstore/ngauth/register_credentials_provider"; +import "#kvstore/ocdbt/register_frontend"; +import "#kvstore/s3/register_frontend"; +import "#kvstore/zip/register_frontend"; diff --git a/src/kvstore/frontend.ts b/src/kvstore/frontend.ts new file mode 100644 index 0000000000..d8419bc2c8 --- /dev/null +++ b/src/kvstore/frontend.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ChunkManager } from "#src/chunk_manager/frontend.js"; +import type { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { KvStoreContext } from "#src/kvstore/context.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { + frontendBackendIsomorphicKvStoreProviderRegistry, + KvStoreProviderRegistry, +} from "#src/kvstore/register.js"; +import { SHARED_KVSTORE_CONTEXT_RPC_ID } from "#src/kvstore/shared_common.js"; +import { registerSharedObjectOwner, SharedObject } from "#src/worker_rpc.js"; + +@registerSharedObjectOwner(SHARED_KVSTORE_CONTEXT_RPC_ID) +export class SharedKvStoreContext + extends SharedObject + implements SharedKvStoreContextBase +{ + kvStoreContext = new KvStoreContext(); + + constructor( + public chunkManager: ChunkManager, + public credentialsManager: SharedCredentialsManager, + ) { + super(); + this.initializeCounterpart(chunkManager.rpc!, { + chunkManager: chunkManager.rpcId, + credentialsManager: credentialsManager.rpcId, + }); + frontendBackendIsomorphicKvStoreProviderRegistry.applyToContext(this); + frontendOnlyKvStoreProviderRegistry.applyToContext(this); + } +} + +export const frontendOnlyKvStoreProviderRegistry = + new KvStoreProviderRegistry(); diff --git a/src/kvstore/gcs/index.rst b/src/kvstore/gcs/index.rst new file mode 100644 index 0000000000..1edfc09d6a --- /dev/null +++ b/src/kvstore/gcs/index.rst @@ -0,0 +1,67 @@ +.. _gcs-kvstore: + +Google Cloud Storage +==================== + +The Google Cloud Storage key-value store is a `root key-value +store` for accessing Google Cloud Storage buckets. + +URL syntax +---------- + +- :file:`gs://{bucket}/{path}` +- :file:`gs+ngauth+http://{nguath-host}/{bucket}/{path}` +- :file:`gs+ngauth+https://{nguath-host}/{bucket}/{path}` + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported + * - :ref:`kvstore-listing` + - Supported with ``storage.objects.list`` permission. + +Authentication +-------------- + +When not using the :ref:`Python API`: + +- The :file:`gs://{bucket}/{path}` syntax implies anonymous access, meaning the + :file:`{bucket}` must allow public read access without `requester pays + `__. Refer to the GCS + documentation for `details on making buckets publicly accessible + `__. +- To access private buckets, the + :file:`gs+ngauth+http://{nguath-host}/{bucket}/{path}` syntax may be used to + authenticate using credentials obtained from an `ngauth + server `__. + +When using the :ref:`Python API` with credentials enabled: + +- The :file:`gs://{bucket}/{path}` syntax uses the `Google Application Default + Credentials + `__, + if available. +- The :file:`gs+ngauth+http://{nguath-host}/{bucket}/{path}` behaves the same as + :file:`gs://{bucket}/{path}` and also uses the Google Application Default + Credentials. The specified :file:`{ngauth-server}` is not used. + +Another method for keeping data private while still allowing Neuroglancer to +access it without the need for an ``ngauth`` server is to include a long, random +string as a suffix of the bucket name, such that the bucket name itself serves +as a `capability URL `__. + +Required permissions +-------------------- + +- The ``storage.objects.get`` permission is required for reading. +- Additionally, the ``storage.objects.list`` permission is required for listing + directories. + +CORS +---- + +Neuroglancer uses the Google Cloud Storage JSON API, which does not require any +CORS configuration on the bucket. diff --git a/src/kvstore/gcs/index.ts b/src/kvstore/gcs/index.ts new file mode 100644 index 0000000000..13e893f0d6 --- /dev/null +++ b/src/kvstore/gcs/index.ts @@ -0,0 +1,150 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverListOptions, + ListResponse, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { + parseArray, + verifyObject, + verifyObjectProperty, + verifyOptionalObjectProperty, + verifyString, + verifyStringArray, +} from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; +import { getRandomHexString } from "#src/util/random.js"; + +export class GcsKvStore implements KvStore { + constructor( + public bucket: string, + public baseUrlForDisplay: string = `gs://${bucket}/`, + private fetchOkImpl: FetchOk = fetchOk, + ) {} + + private getObjectUrl(key: string): string { + // Include random query string parameter (ignored by GCS) to bypass GCS cache + // and ensure a cached response is never used. + // + // This addresses two issues related to GCS: + // + // 1. GCS fails to send an updated `Access-Control-Allow-Origin` header in 304 + // responses to cache revalidation requests. + // + // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 + // + // The random query string parameter ensures cached responses are never used. + // + // Note: This issue does not apply to gs+xml because with the XML API, the + // Access-Control-Allow-Origin response header does not vary with the Origin. + // + // 2. If the object does not prohibit caching (e.g. public bucket and default + // `cache-control` metadata value), GCS may return stale responses. + return ( + `https://storage.googleapis.com/storage/v1/b/${this.bucket}/o/` + + `${encodeURIComponent(key)}?alt=media` + + `&neuroglancer=${getRandomHexString()}` + ); + } + + stat(key: string, options: StatOptions): Promise { + return stat(this, key, this.getObjectUrl(key), options, this.fetchOkImpl); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + return read(this, key, this.getObjectUrl(key), options, this.fetchOkImpl); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const { progressListener } = options; + using _span = + progressListener === undefined + ? undefined + : new ProgressSpan(progressListener, { + message: `Listing prefix ${this.getUrl(prefix)}`, + }); + const delimiter = "/"; + // Include `neuroglancerOrigin` query parameter that is ignored by GCS to + // workaround + // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 (though + // it is not clear it would ever apply to bucket listing). + const response = await this.fetchOkImpl( + `https://storage.googleapis.com/storage/v1/b/${this.bucket}/o?` + + `delimiter=${encodeURIComponent(delimiter)}&prefix=${encodeURIComponent( + prefix, + )}&` + + `neuroglancerOrigin=${encodeURIComponent(location.origin)}`, + { + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const responseJson = await response.json(); + + verifyObject(responseJson); + const directories = verifyOptionalObjectProperty( + responseJson, + "prefixes", + verifyStringArray, + [], + ).map((prefix) => prefix.substring(0, prefix.length - 1)); + + const entries = verifyOptionalObjectProperty( + responseJson, + "items", + (items) => + parseArray(items, (item) => { + verifyObject(item); + return verifyObjectProperty(item, "name", verifyString); + }), + [], + ) + .filter((name) => !name.endsWith("_$folder$")) + .map((name) => ({ key: name })); + + return { + directories, + entries, + }; + } + + getUrl(path: string) { + return this.baseUrlForDisplay + encodePathForUrl(path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/gcs/register.ts b/src/kvstore/gcs/register.ts new file mode 100644 index 0000000000..4eb612bf77 --- /dev/null +++ b/src/kvstore/gcs/register.ts @@ -0,0 +1,45 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pythonIntegration from "#python_integration_build"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { GcsKvStore } from "#src/kvstore/gcs/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +function gcsProvider(_context: SharedKvStoreContextBase): BaseKvStoreProvider { + return { + scheme: "gs", + description: pythonIntegration + ? "Google Cloud Storage" + : "Google Cloud Storage (anonymous)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error("Invalid URL, expected `gs:///`"); + } + const [, bucket, path] = m; + return { + store: new GcsKvStore(bucket), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + gcsProvider, +); diff --git a/src/kvstore/gzip/file_handle.ts b/src/kvstore/gzip/file_handle.ts new file mode 100644 index 0000000000..c12f83882c --- /dev/null +++ b/src/kvstore/gzip/file_handle.ts @@ -0,0 +1,235 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + DriverReadOptions, + FileHandle, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { decodeGzipStream } from "#src/util/gzip.js"; + +export const EXPECTED_HEADER_OVERHEAD = 100; + +export class GzipFileHandle + implements FileHandle +{ + constructor( + public base: BaseHandle, + public format: CompressionFormat, + ) {} + + async stat(options: StatOptions): Promise { + await this.base.stat(options); + return { totalSize: undefined }; + } + + async read(options: DriverReadOptions): Promise { + const { byteRange } = options; + if (byteRange === undefined) { + const readResponse = await this.base.read(options); + if (readResponse === undefined) return undefined; + return { + response: new Response( + decodeGzipStream(readResponse.response, this.format), + ), + offset: 0, + length: undefined, + totalSize: undefined, + }; + } + if ("suffixLength" in byteRange || byteRange.offset !== 0) { + throw new Error( + `Byte range with offset not supported: ${JSON.stringify(byteRange)}`, + ); + } + + // There is no way to force a flush on a `DecompressionStream`; to ensure we + // have all available output from the input, we must close the readable + // stream, which prevents any further writes. This means if more input is + // required, we have to redo the decode. In almost all cases, though, + // `EXPECTED_HEADER_OVERHEAD` should be sufficient and it won't be necessary + // to fetch additional encoded data. + let decodedArray = new Uint8Array(byteRange.length); + const parts: Uint8Array[] = []; + let encodedBytesReceived = 0; + let expectedEncodedBytes = byteRange.length + EXPECTED_HEADER_OVERHEAD; + while (true) { + const readResponse = await this.base.read({ + ...options, + byteRange: { + offset: encodedBytesReceived, + length: expectedEncodedBytes - encodedBytesReceived, + }, + }); + if (readResponse === undefined) return undefined; + { + const part = new Uint8Array(await readResponse.response.arrayBuffer()); + parts.push(part); + encodedBytesReceived += part.length; + } + + const decompressionStream = new DecompressionStream("gzip"); + const writer = decompressionStream.writable.getWriter(); + const writePromises: Promise[] = []; + for (const part of parts) { + writePromises.push(writer.write(part)); + } + writePromises.push(writer.close()); + const reader = decompressionStream.readable.getReader(); + let decodedOffset = 0; + try { + while (decodedOffset < decodedArray.length) { + let { value } = await reader.read(); + if (value === undefined) { + // no more decoded data available + break; + } + const remainingLength = decodedArray.length - decodedOffset; + if (value.length > remainingLength) { + value = value.subarray(0, remainingLength); + } + decodedArray.set(value, decodedOffset); + decodedOffset += value.length; + } + + if ( + decodedOffset === decodedArray.length || + encodedBytesReceived === readResponse.totalSize + ) { + if (decodedOffset < decodedArray.length) { + decodedArray = decodedArray.subarray(0, decodedOffset); + } + return { + response: new Response(decodedArray), + offset: 0, + length: decodedArray.length, + totalSize: undefined, + }; + } + } finally { + await reader.cancel(); + await Promise.allSettled(writePromises); + } + + expectedEncodedBytes += Math.min( + 100, + decodedArray.length - decodedOffset, + ); + } + } + + getUrl() { + return this.base.getUrl() + "|gzip"; + } +} + +export async function gzipRead( + base: ReadableKvStore, + baseKey: Key, + format: CompressionFormat, + options: DriverReadOptions, +) { + const { byteRange } = options; + if (byteRange === undefined) { + const readResponse = await base.read(baseKey, options); + if (readResponse === undefined) return undefined; + return { + response: new Response(decodeGzipStream(readResponse.response, format)), + offset: 0, + length: undefined, + totalSize: undefined, + }; + } + if ("suffixLength" in byteRange || byteRange.offset !== 0) { + throw new Error( + `Byte range with offset not supported: ${JSON.stringify(byteRange)}`, + ); + } + + // There is no way to force a flush on a `DecompressionStream`; to ensure we + // have all available output from the input, we must close the readable + // stream, which prevents any further writes. This means if more input is + // required, we have to redo the decode. In almost all cases, though, + // `EXPECTED_HEADER_OVERHEAD` should be sufficient and it won't be necessary + // to fetch additional encoded data. + let decodedArray = new Uint8Array(byteRange.length); + const parts: Uint8Array[] = []; + let encodedBytesReceived = 0; + let expectedEncodedBytes = byteRange.length + EXPECTED_HEADER_OVERHEAD; + while (true) { + const readResponse = await base.read(baseKey, { + ...options, + byteRange: { + offset: encodedBytesReceived, + length: expectedEncodedBytes - encodedBytesReceived, + }, + }); + if (readResponse === undefined) return undefined; + { + const part = new Uint8Array(await readResponse.response.arrayBuffer()); + parts.push(part); + encodedBytesReceived += part.length; + } + + const decompressionStream = new DecompressionStream("gzip"); + const writer = decompressionStream.writable.getWriter(); + const writePromises: Promise[] = []; + for (const part of parts) { + writePromises.push(writer.write(part)); + } + writePromises.push(writer.close()); + const reader = decompressionStream.readable.getReader(); + let decodedOffset = 0; + try { + while (decodedOffset < decodedArray.length) { + let { value } = await reader.read(); + if (value === undefined) { + // no more decoded data available + break; + } + const remainingLength = decodedArray.length - decodedOffset; + if (value.length > remainingLength) { + value = value.subarray(0, remainingLength); + } + decodedArray.set(value, decodedOffset); + decodedOffset += value.length; + } + + if ( + decodedOffset === decodedArray.length || + encodedBytesReceived === readResponse.totalSize + ) { + if (decodedOffset < decodedArray.length) { + decodedArray = decodedArray.subarray(0, decodedOffset); + } + return { + response: new Response(decodedArray), + offset: 0, + length: decodedArray.length, + totalSize: undefined, + }; + } + } finally { + await reader.cancel(); + await Promise.allSettled(writePromises); + } + + expectedEncodedBytes += Math.min(100, decodedArray.length - decodedOffset); + } +} diff --git a/src/kvstore/gzip/index.rst b/src/kvstore/gzip/index.rst new file mode 100644 index 0000000000..4dec5e5da0 --- /dev/null +++ b/src/kvstore/gzip/index.rst @@ -0,0 +1,43 @@ +.. _gzip-kvstore: + +Gzip +==== + +The gzip :ref:`key-value store adapter` provides transparent +access to `gzip-encoded `__ files. + +URL syntax +---------- + +- :file:`{base-kvstore-url}|gzip:` + +The :file:`{base-kvstore-url}` must refer to a file, and typically ends with +``.gz``. + +For example: + +- ``gs://bucket/path/to/image.nii.gz|gzip:`` + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Only prefix (byte offset of 0) byte range requests supported, if + supported by the base key-value store. + * - :ref:`kvstore-listing` + - Not applicable. + +.. list-table:: Required capabilities of base key-value store + + * - :ref:`kvstore-byte-range-reads` + - Prefix (byte offset of 0) byte range requests optional. + * - :ref:`kvstore-listing` + - Not needed. + +Auto detection +-------------- + +Gzip-encoded files are detected automatically based on a signature at the start +of the file. diff --git a/src/kvstore/gzip/index.ts b/src/kvstore/gzip/index.ts new file mode 100644 index 0000000000..741e67d21c --- /dev/null +++ b/src/kvstore/gzip/index.ts @@ -0,0 +1,96 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + DriverReadOptions, + KvStore, + ReadResponse, + StatOptions, + StatResponse, + FileHandle, +} from "#src/kvstore/index.js"; +import { isGzipFormat } from "#src/util/gzip.js"; + +export class GzipKvStore implements KvStore { + constructor( + public base: FileHandle, + public scheme: string, + public format: CompressionFormat, + ) {} + + getUrl(key: string) { + this.validatePath(key); + return this.base.getUrl() + `|${this.scheme}`; + } + + private validatePath(path: string) { + if (path) { + throw new Error( + `"${this.scheme}:" does not support non-empty path ${JSON.stringify(path)}`, + ); + } + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + this.validatePath(key); + await this.base.stat(options); + return { totalSize: undefined }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + this.validatePath(key); + return new GzipFileHandle(this.base, this.format).read(options); + } + + get supportsOffsetReads() { + return false; + } + get supportsSuffixReads() { + return false; + } + get singleKey() { + return true; + } +} + +async function detectGzip( + options: AutoDetectFileOptions, +): Promise { + if (!isGzipFormat(options.prefix)) { + return []; + } + return [{ suffix: "gzip:", description: "gzip-compressed" }]; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 3, + suffixLength: 0, + match: detectGzip, + }); +} diff --git a/src/kvstore/gzip/register.ts b/src/kvstore/gzip/register.ts new file mode 100644 index 0000000000..2c5357ce53 --- /dev/null +++ b/src/kvstore/gzip/register.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { GzipKvStore, registerAutoDetect } from "#src/kvstore/gzip/index.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; + +function gzipProvider( + scheme: string, + format: CompressionFormat, +): KvStoreAdapterProvider { + return { + scheme, + description: `transparent ${scheme} decoding`, + getKvStore(url, base) { + ensureEmptyUrlSuffix(url); + return { + store: new GzipKvStore( + new KvStoreFileHandle(base.store, base.path), + scheme, + format, + ), + path: "", + }; + }, + }; +} + +frontendBackendIsomorphicKvStoreProviderRegistry.registerKvStoreAdapterProvider( + () => gzipProvider("gzip", "gzip"), +); + +registerAutoDetect( + frontendBackendIsomorphicKvStoreProviderRegistry.autoDetectRegistry, +); diff --git a/src/kvstore/http/backend.ts b/src/kvstore/http/backend.ts new file mode 100644 index 0000000000..8b21f4b732 --- /dev/null +++ b/src/kvstore/http/backend.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { ReadableHttpKvStore } from "#src/kvstore/http/common.js"; +import type { DriverListOptions, ListResponse } from "#src/kvstore/index.js"; +import { proxyList } from "#src/kvstore/proxy.js"; + +export class HttpKvStore extends ReadableHttpKvStore { + list(prefix: string, options: DriverListOptions): Promise { + return proxyList(this.sharedKvStoreContext, this.getUrl(prefix), options); + } +} diff --git a/src/kvstore/http/common.ts b/src/kvstore/http/common.ts new file mode 100644 index 0000000000..e4f3caeea6 --- /dev/null +++ b/src/kvstore/http/common.ts @@ -0,0 +1,115 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { + KvStoreProviderRegistry, + SharedKvStoreContextBase, +} from "#src/kvstore/register.js"; +import { getBaseHttpUrlAndPath, joinBaseUrlAndPath } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; + +export class ReadableHttpKvStore< + SharedKvStoreContext extends SharedKvStoreContextBase, +> implements KvStore +{ + constructor( + public sharedKvStoreContext: SharedKvStoreContext, + public baseUrl: string, + public baseUrlForDisplay: string = baseUrl, + public fetchOkImpl: FetchOk = fetchOk, + ) {} + + stat(key: string, options: StatOptions): Promise { + return stat( + this, + key, + joinBaseUrlAndPath(this.baseUrl, key), + options, + this.fetchOkImpl, + ); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + return read( + this, + key, + joinBaseUrlAndPath(this.baseUrl, key), + options, + this.fetchOkImpl, + ); + } + + getUrl(path: string) { + return joinBaseUrlAndPath(this.baseUrlForDisplay, path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} + +function httpProvider( + scheme: string, + sharedKvStoreContext: SharedKvStoreContext, + httpKvStoreClass: typeof ReadableHttpKvStore, +): BaseKvStoreProvider { + return { + scheme, + description: `${scheme} (unauthenticated)`, + getKvStore(url) { + try { + const { baseUrl, path } = getBaseHttpUrlAndPath(url.url); + return { + store: new httpKvStoreClass(sharedKvStoreContext, baseUrl), + path, + }; + } catch (e) { + throw new Error(`Invalid URL ${JSON.stringify(url.url)}`, { + cause: e, + }); + } + }, + }; +} + +export function registerProviders< + SharedKvStoreContext extends SharedKvStoreContextBase, +>( + registry: KvStoreProviderRegistry, + httpKvStoreClass: typeof ReadableHttpKvStore, +) { + for (const httpScheme of ["http", "https"]) { + registry.registerBaseKvStoreProvider((context) => + httpProvider(httpScheme, context, httpKvStoreClass), + ); + } +} diff --git a/src/kvstore/http/frontend.ts b/src/kvstore/http/frontend.ts new file mode 100644 index 0000000000..778debd370 --- /dev/null +++ b/src/kvstore/http/frontend.ts @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ReadableHttpKvStore } from "#src/kvstore/http/common.js"; +import { listFromHtmlDirectoryListing } from "#src/kvstore/http/html_directory_listing.js"; +import type { DriverListOptions, ListResponse } from "#src/kvstore/index.js"; +import { getS3UrlKind, listS3CompatibleUrl } from "#src/kvstore/s3/list.js"; +import { joinBaseUrlAndPath } from "#src/kvstore/url.js"; + +export class HttpKvStore extends ReadableHttpKvStore { + list(prefix: string, options: DriverListOptions): Promise { + const { memoize } = this.sharedKvStoreContext.chunkManager; + const s3UrlKind = getS3UrlKind(memoize, this.baseUrlForDisplay); + if (s3UrlKind === null) { + return listFromHtmlDirectoryListing( + this.baseUrl, + prefix, + this.fetchOkImpl, + options, + ); + } + if (s3UrlKind !== undefined) { + return listS3CompatibleUrl( + joinBaseUrlAndPath(this.baseUrl, prefix), + this.baseUrlForDisplay, + memoize, + this.fetchOkImpl, + options, + ); + } + return Promise.any([ + listFromHtmlDirectoryListing( + this.baseUrl, + prefix, + this.fetchOkImpl, + options, + ), + listS3CompatibleUrl( + joinBaseUrlAndPath(this.baseUrl, prefix), + this.baseUrlForDisplay, + memoize, + this.fetchOkImpl, + options, + ), + ]); + } +} diff --git a/src/kvstore/http/html_directory_listing.ts b/src/kvstore/http/html_directory_listing.ts new file mode 100644 index 0000000000..0e7f9bff33 --- /dev/null +++ b/src/kvstore/http/html_directory_listing.ts @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2019 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + type ListEntry, + type DriverListOptions, + type ListResponse, + normalizeListResponse, +} from "#src/kvstore/index.js"; +import { isS3ListResponse } from "#src/kvstore/s3/list.js"; +import { encodePathForUrl, extractQueryAndFragment } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { + ProgressSpan, + type ProgressOptions, +} from "#src/util/progress_listener.js"; + +/** + * Obtains a directory listing from a server that supports HTML directory listings. + */ +export async function getHtmlDirectoryListing( + url: string, + options: { + fetchOkImpl?: FetchOk; + } & Partial = {}, +): Promise { + const baseUrl = extractQueryAndFragment(url).base; + const { fetchOkImpl = fetchOk, signal, progressListener } = options; + const response = await fetchOkImpl( + url, + /*init=*/ { + headers: { accept: "text/html" }, + signal: signal, + progressListener, + }, + ); + const contentType = response.headers.get("content-type"); + if (contentType === null || /\btext\/html\b/i.exec(contentType) === null) { + throw new Error(`HTML directory listing not supported`); + } + const text = await response.text(); + // Verify that the response is a not an S3 ListObjects response. Per + // https://github.com/getmoto/moto/issues/8560, moto responds with + // `content-type: text/html`. + if (isS3ListResponse(text)) { + throw new Error( + `HTML directory listing not supported, S3-compatible API detected`, + ); + } + const doc = new DOMParser().parseFromString(text, "text/html"); + const nodes = doc.evaluate( + "//a/@href", + doc, + null, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + const results = new Set(); + for (let i = 0, n = nodes.snapshotLength; i < n; ++i) { + const node = nodes.snapshotItem(i)!; + const href = node.textContent; + if (href === null) continue; + const withoutQuery = extractQueryAndFragment(href).base; + if (withoutQuery) { + const resolvedUrl = new URL(withoutQuery, baseUrl).toString(); + if (resolvedUrl.startsWith(baseUrl) && resolvedUrl !== baseUrl) { + results.add(resolvedUrl); + } + } + } + return Array.from(results); +} + +export async function listFromHtmlDirectoryListing( + baseUrl: string, + prefix: string, + fetchOkImpl: FetchOk, + options: DriverListOptions, +): Promise { + const { progressListener } = options; + using _span = + progressListener && + new ProgressSpan(progressListener, { + message: `Requesting HTML directory listing for ${baseUrl}`, + }); + const { base, queryAndFragment } = extractQueryAndFragment(baseUrl); + const baseAndPrefix = base + encodePathForUrl(prefix); + const fullUrl = baseAndPrefix + queryAndFragment; + const m = fullUrl.match(/^([a-z]+:\/\/.*\/)([^/?#]*)$/); + if (m === null) { + throw new Error(`Invalid HTTP URL: ${fullUrl}`); + } + const [, directoryUrl] = m; + const listing = await getHtmlDirectoryListing( + directoryUrl + queryAndFragment, + { + fetchOkImpl, + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const entries: ListEntry[] = []; + const directories: string[] = []; + for (const entry of listing) { + if (!entry.startsWith(baseAndPrefix)) continue; + const p = decodeURIComponent(entry.substring(base.length)); + if (p.endsWith("/")) { + directories.push(p.substring(0, p.length - 1)); + } else { + entries.push({ key: p }); + } + } + return normalizeListResponse({ entries, directories }); +} diff --git a/src/kvstore/http/index.rst b/src/kvstore/http/index.rst new file mode 100644 index 0000000000..8e024c216b --- /dev/null +++ b/src/kvstore/http/index.rst @@ -0,0 +1,84 @@ +.. _http-kvstore: + +HTTP +==== + +The HTTP key-value store is a :ref:`root key-value store` for +accessing regular HTTP servers. + +URL syntax +---------- + +- :file:`http://{host}/{path}` +- :file:`https://{host}/{path}` +- :file:`https://{host}/{path}?{query}` + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported if the server supports `HTTP range requests + `__. + * - :ref:`kvstore-listing` + - Supported if the server supports: + + - traditional HTML directory listings in response to + :file:`https://{host}/{path}/` GET requests, or + - S3-compatible bucket listing. + +CORS +---- + +If the HTTP URL refers to a different `origin +`__ +than that from which the Neuroglancer client itself is hosted, the specified +:file:`{host}` must be configured to allow `cross-origin +`__ requests. + +The recommended CORS headers are: + +- ``access-control-allow-origin: *`` +- ``access-control-expose-headers: *`` + +Alternatively, more specific CORS headers may be used: + +- ``access-control-allow-origin: https://{neuroglancer-host}`` +- ``access-control-expose-headers: content-range, content-encoding`` + +.. warning:: + + CORS headers can allow malicious websites to access data on servers that are + accessible to the public internet, including servers listening only on + localhost. Any private data should be protected by appropriate access control + mechanisms such as `capability URLs + `__. + +:file:`http://` access from :file:`https://` origin +--------------------------------------------------- + +Note that because of `mixed content blocking +`__ in +modern browsers, if the Neuroglancer client itself is served from an +:file:`https://` origin (e.g. :file:`https://neuroglancer-demo.appspot.com`), +Neuroglancer cannot access data sources using :file:`http://` URLs, only +:file:`https://`) URLs are allowed. However, data sources served from +:file:`http://127.0.0.1[:PORT]` (on Chrome and Firefox) and +:file:`http://localhost[:PORT]` (on Chrome) are allowed by exceptions to the +normal mixed content blocking. + +If the Neuroglancer client is served from an :file:`http://` origin, data sources +served from both :file:`http://` and :file:`https://` URLs are supported. + +Query parameters +---------------- + +If the server requires query parameters (e.g. an access token), they may be +specified as :file:`https://{host}/{path}?{query}`. + +.. note:: + + When query parameters are specified for a directory, e.g. + :file:`https://{host}/dataset.zarr/?{query}`, they will also be used for all + files accessed within that directory. diff --git a/src/kvstore/http/read.ts b/src/kvstore/http/read.ts new file mode 100644 index 0000000000..2690c5b884 --- /dev/null +++ b/src/kvstore/http/read.ts @@ -0,0 +1,292 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { composeByteRangeRequest } from "#src/kvstore/byte_range/file_handle.js"; +import type { + ByteRange, + DriverReadOptions, + ReadableKvStore, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { KvStoreFileHandle, NotFoundError } from "#src/kvstore/index.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk, HttpError, isNotFoundError } from "#src/util/http_request.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; + +function getRangeHeader(request: ByteRange | undefined): string | undefined { + if (request === undefined) return undefined; + return `bytes=${request.offset}-${request.offset + request.length - 1}`; +} + +/** + * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the + * cache is disabled. Disabling the cache works around the problem. + * + * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 + */ +const byteRangeCacheMode = + navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; + +function wasRedirectedToDirectoryListing(url: string, response: Response) { + return new URL(url).pathname + "/" === new URL(response.url).pathname; +} + +function parse206ContentRangeHeader(contentRange: string) { + const m = contentRange.match(/bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/); + if (m === null) { + throw new Error( + `Invalid content-range header: ${JSON.stringify(contentRange)}`, + ); + } + const offset = parseInt(m[1], 10); + const endPos = parseInt(m[2], 10); + let totalSize: number | undefined; + if (m[3] !== "*") { + totalSize = parseInt(m[3], 10); + } + const length = endPos - offset + 1; + return { offset, length, totalSize }; +} + +export async function read( + store: ReadableKvStore, + key: Key, + url: string, + options: DriverReadOptions, + fetchOkImpl: FetchOk = fetchOk, +): Promise { + let resolvedByteRange: ByteRange | undefined; + try { + const { byteRange: byteRangeRequest } = options; + let rangeHeader: string | undefined; + // The HTTP spec supports suffixLength requests directly via "Range: + // bytes=-N" requests, which avoids the need for a separate HEAD request. + // However, per + // https://fetch.spec.whatwg.org/#cors-safelisted-request-header a suffix + // length byte range request header will always trigger an OPTIONS preflight + // request, which would otherwise be avoided. This negates the benefit of + // using a suffixLength request directly. Additionally, some servers such as + // the npm http-server package and https://uk1s3.embassy.ebi.ac.uk/ do not + // correctly handle suffixLength requests or do not correctly handle CORS + // preflight requests. To avoid those issues, always just issue a separate + // HEAD request to determine the length. + if (byteRangeRequest !== undefined) { + if ("suffixLength" in byteRangeRequest) { + const statResponse = await stat(store, key, url, options, fetchOkImpl); + if (statResponse === undefined) return undefined; + const { totalSize } = statResponse; + if (totalSize === undefined) { + throw new Error( + `Failed to determine total size of ${store.getUrl(key)} in order to fetch suffix ${JSON.stringify(byteRangeRequest)}`, + ); + } + resolvedByteRange = composeByteRangeRequest( + { offset: 0, length: totalSize }, + byteRangeRequest, + ).outer; + if (resolvedByteRange.length === 0) { + // Skip zero-byte read, since totalSize is already known. + return { + ...resolvedByteRange, + totalSize, + response: new Response(new Uint8Array(0)), + }; + } + rangeHeader = getRangeHeader(resolvedByteRange); + } else { + resolvedByteRange = byteRangeRequest; + if (resolvedByteRange.length === 0) { + // The HTTP range header does not support zero-length byte range + // requests. + // + // Convert zero-length byte range to length-1 byte range, and then + // discard the response. If the requested offset is 0, and the file is + // empty, then this will result in a 416 Range Not Satisfiable + // response. + rangeHeader = getRangeHeader({ + offset: Math.max(resolvedByteRange.offset - 1, 0), + length: 1, + }); + } else { + rangeHeader = getRangeHeader(resolvedByteRange); + } + } + } + const requestInit: RequestInit & { progressListener?: ProgressListener } = { + signal: options.signal, + progressListener: options.progressListener, + }; + if (rangeHeader !== undefined) { + requestInit.headers = { range: rangeHeader }; + requestInit.cache = byteRangeCacheMode; + } + let response = await fetchOkImpl(url, requestInit); + if (wasRedirectedToDirectoryListing(url, response)) { + return undefined; + } + let offset: number | undefined; + let length: number | undefined; + let totalSize: number | undefined; + if (response.status === 206) { + const contentRange = response.headers.get("content-range"); + if (contentRange === null) { + // Content-range should always be sent, but some buggy servers don't + // send it. + if (resolvedByteRange !== undefined) { + offset = resolvedByteRange.offset; + } else { + throw new Error( + "Unexpected HTTP 206 response when no byte range specified.", + ); + } + } + if (contentRange !== null) { + ({ offset, length, totalSize } = + parse206ContentRangeHeader(contentRange)); + } + } else { + length = totalSize = getBodyLength(response.headers); + } + if (offset === undefined) { + offset = 0; + } + if (length === undefined) { + length = getBodyLength(response.headers); + } + if (resolvedByteRange?.length === 0) { + response = new Response(new Uint8Array(0)); + offset = resolvedByteRange.offset; + length = 0; + } + return { + response, + offset, + length, + totalSize, + }; + } catch (e) { + if ( + e instanceof HttpError && + e.status === 416 && + resolvedByteRange?.length === 0 && + resolvedByteRange.offset === 0 + ) { + return { + response: new Response(new Uint8Array(0)), + offset: 0, + length: 0, + totalSize: 0, + }; + } + return handleThrowIfMissing(store, key, options, e); + } +} + +function getBodyLength(headers: Headers): number | undefined { + const contentLength = headers.get("content-length"); + const contentEncoding = headers.get("content-encoding"); + if (contentEncoding === null && contentLength !== null) { + const size = Number(contentLength); + if (!Number.isFinite(size) || size < 0) { + throw new Error(`Invalid content-length: {contentLength}`); + } + return size; + } + return undefined; +} + +function handleThrowIfMissing( + store: ReadableKvStore, + key: Key, + options: { throwIfMissing?: boolean }, + error: unknown, +) { + if (isNotFoundError(error)) { + if (options.throwIfMissing === true) { + throw new NotFoundError(new KvStoreFileHandle(store, key), { + cause: error, + }); + } + return undefined; + } + throw error; +} + +export async function stat( + store: ReadableKvStore, + key: Key, + url: string, + options: StatOptions, + fetchOkImpl: FetchOk = fetchOk, +): Promise { + // First try HEAD request. + try { + const response = await fetchOkImpl(url, { + method: "HEAD", + signal: options.signal, + progressListener: options.progressListener, + }); + if (wasRedirectedToDirectoryListing(url, response)) return undefined; + return { totalSize: getBodyLength(response.headers) }; + } catch (e) { + if ( + e instanceof HttpError && + (e.status === 405 /* method not allowed */ || + e.status === 501) /* not implemented */ + ) { + // HEAD may not be supported, use GET with one byte range instead. + // + // For example, + // https://data-proxy.ebrains.eu/api/v1/buckets/localizoom/14122_mPPC_BDA_s186.tif/14122_mPPC_BDA_s186.dzi + // returns HTTP 405 Method Not Allowed in response to HEAD requests. + // + // Servers are not supposed to return 501 for HEAD requests + // (https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/501), but + // some do anyway: + // + // https://github.com/google/neuroglancer/issues/704 + } else { + return handleThrowIfMissing(store, key, options, e); + } + } + + // Try GET with one-byte range instead. + try { + const response = await fetchOkImpl(url, { + signal: options.signal, + progressListener: options.progressListener, + headers: { range: "bytes=0-0" }, + }); + if (wasRedirectedToDirectoryListing(url, response)) return undefined; + let totalSize: number | undefined; + if (response.status === 200) { + totalSize = getBodyLength(response.headers); + } else { + const contentRange = response.headers.get("content-range"); + if (contentRange !== null) { + ({ totalSize } = parse206ContentRangeHeader(contentRange)); + } + } + return { totalSize }; + } catch (e) { + if (e instanceof HttpError && e.status === 416) { + return { totalSize: 0 }; + } + return handleThrowIfMissing(store, key, options, e); + } +} diff --git a/src/kvstore/http/register_backend.ts b/src/kvstore/http/register_backend.ts new file mode 100644 index 0000000000..56f4d1e0d6 --- /dev/null +++ b/src/kvstore/http/register_backend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import { HttpKvStore } from "#src/kvstore/http/backend.js"; +import { registerProviders } from "#src/kvstore/http/common.js"; + +registerProviders(backendOnlyKvStoreProviderRegistry, HttpKvStore); diff --git a/src/kvstore/http/register_frontend.ts b/src/kvstore/http/register_frontend.ts new file mode 100644 index 0000000000..2798a3b1db --- /dev/null +++ b/src/kvstore/http/register_frontend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { registerProviders } from "#src/kvstore/http/common.js"; +import { HttpKvStore } from "#src/kvstore/http/frontend.js"; + +registerProviders(frontendOnlyKvStoreProviderRegistry, HttpKvStore); diff --git a/src/kvstore/icechunk/async_computation.ts b/src/kvstore/icechunk/async_computation.ts new file mode 100644 index 0000000000..d4f964f55f --- /dev/null +++ b/src/kvstore/icechunk/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_zstd.js"; diff --git a/src/kvstore/icechunk/auto_detect.ts b/src/kvstore/icechunk/auto_detect.ts new file mode 100644 index 0000000000..340ef9f893 --- /dev/null +++ b/src/kvstore/icechunk/auto_detect.ts @@ -0,0 +1,37 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; + +const INITIAL_MAIN_REF = "refs/branch.main/ZZZZZZZZ.json"; + +const EXPECTED_SUB_DIRECTORIES = new Set(["refs", "snapshots"]); + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat({ + fileNames: new Set([INITIAL_MAIN_REF]), + subDirectories: EXPECTED_SUB_DIRECTORIES, + match: async ({ fileNames, subDirectories }) => { + if (!fileNames.has(INITIAL_MAIN_REF)) { + // Check based on sub-directories + for (const subDirectory of EXPECTED_SUB_DIRECTORIES) { + if (!subDirectories.has(subDirectory)) return []; + } + } + return [{ suffix: "icechunk:", description: "Icechunk repository" }]; + }, + }); +} diff --git a/src/kvstore/icechunk/backend.ts b/src/kvstore/icechunk/backend.ts new file mode 100644 index 0000000000..170769e11c --- /dev/null +++ b/src/kvstore/icechunk/backend.ts @@ -0,0 +1,112 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { getListResponseFromSnapshot } from "#src/kvstore/icechunk/list.js"; +import { + resolveRefSpec, + getSnapshot, +} from "#src/kvstore/icechunk/metadata_cache.js"; +import { read, stat } from "#src/kvstore/icechunk/read.js"; +import type { Snapshot } from "#src/kvstore/icechunk/snapshot.js"; +import type { RefSpec } from "#src/kvstore/icechunk/url.js"; +import { getIcechunkUrl } from "#src/kvstore/icechunk/url.js"; +import type { + DriverListOptions, + DriverReadOptions, + KvStore, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export class IcechunkKvStore implements KvStore { + constructor( + public sharedKvStoreContext: SharedKvStoreContextCounterpart, + public baseUrl: string, + public refSpec: RefSpec | undefined, + ) {} + + private snapshot: Snapshot | undefined; + + private async getSnapshot(options: Partial) { + let { snapshot } = this; + if (snapshot === undefined) { + const snapshotId = await resolveRefSpec( + this.sharedKvStoreContext, + this.baseUrl, + this.refSpec ?? { branch: "main" }, + options, + ); + snapshot = this.snapshot = await getSnapshot( + this.sharedKvStoreContext, + this.baseUrl, + snapshotId, + options, + ); + } + return snapshot; + } + + getUrl(key: string) { + return getIcechunkUrl(this, key); + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const snapshot = await this.getSnapshot(options); + return stat( + this.sharedKvStoreContext, + this.baseUrl, + snapshot, + key, + options, + ); + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const snapshot = await this.getSnapshot(options); + return read( + this.sharedKvStoreContext, + this.baseUrl, + snapshot, + key, + options, + ); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const snapshot = await this.getSnapshot(options); + return getListResponseFromSnapshot(snapshot, prefix); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/icechunk/complete_url.ts b/src/kvstore/icechunk/complete_url.ts new file mode 100644 index 0000000000..632dffb815 --- /dev/null +++ b/src/kvstore/icechunk/complete_url.ts @@ -0,0 +1,100 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { + CompletionResult, + KvStoreAdapterCompleteUrlOptions, +} from "#src/kvstore/context.js"; +import { isSnapshotId } from "#src/kvstore/icechunk/ref.js"; +import { parseRefSpec } from "#src/kvstore/icechunk/url.js"; +import { listKvStore } from "#src/kvstore/index.js"; +import { encodePathForUrl, joinPath } from "#src/kvstore/url.js"; +import type { CompletionWithDescription } from "#src/util/completion.js"; + +export async function completeIcechunkUrl( + _sharedKvStoreContext: SharedKvStoreContextCounterpart, + options: KvStoreAdapterCompleteUrlOptions, +): Promise { + const { url } = options; + const suffix = url.suffix ?? ""; + if (suffix === "") { + return { + offset: 0, + completions: [{ value: "@", description: "Ref specifier" }], + }; + } + const m = suffix.match(/^@([^/]*)((?:\/|$).*)/); + if (m === null) return undefined; + const [, version, rest] = m; + if (rest !== "") { + parseRefSpec(version); + return undefined; + } + + let refCompletionsPromise: Promise | undefined; + if ( + version.match( + /^(?:(?:(?:t|$)(?:a|$)(?:g|$)(?:\.|$))|(?:(?:b|$)(?:r|$)(?:a|$)(?:n|$)(?:c|$)(?:h|$)(?:\.|$)))/, + ) + ) { + const refsPath = joinPath(options.base.path, `refs/`); + refCompletionsPromise = listKvStore( + options.base.store, + refsPath + decodeURIComponent(version), + { signal: options.signal, progressListener: options.progressListener }, + ).then(({ directories }) => + directories.map((path) => { + const ref = path.slice(refsPath.length); + return { + value: encodePathForUrl(ref) + "/", + description: ref.startsWith("tag.") ? "Tag" : "Branch", + }; + }), + ); + } + + let snapshotCompletionsPromise: + | Promise + | undefined; + if (version.match(/^[0-9ABCDEFGHJKMNPQRSTVWXYZ]{0,20}$/)) { + const snapshotsPath = joinPath(options.base.path, `snapshots/`); + snapshotCompletionsPromise = listKvStore( + options.base.store, + snapshotsPath + version, + { signal: options.signal, progressListener: options.progressListener }, + ).then(({ entries }) => { + const results: CompletionWithDescription[] = []; + for (const { key } of entries) { + const snapshotId = key.slice(snapshotsPath.length); + if (!isSnapshotId(snapshotId)) continue; + results.push({ + value: snapshotId + "/", + description: "Snapshot", + }); + } + return results; + }); + } + + return { + offset: 1, + completions: [ + ...((await refCompletionsPromise) ?? []), + ...((await snapshotCompletionsPromise) ?? []), + ], + }; +} diff --git a/src/kvstore/icechunk/crockford_base32.ts b/src/kvstore/icechunk/crockford_base32.ts new file mode 100644 index 0000000000..c025fd6dd6 --- /dev/null +++ b/src/kvstore/icechunk/crockford_base32.ts @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Derived from: https://github.com/LinusU/base32-encode/ + +/** + * @license + * MIT License + * + * Copyright (c) 2016-2021 Linus Unnebäck + * + * 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. + */ +const ALPHABET = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"; + +export function crockfordBase32Encode(input: Uint8Array) { + const numBytes = input.length; + let value = 0; + let output = ""; + let bits = 0; + for (let i = 0; i < numBytes; ++i) { + value = (value << 8) | input[i]; + for (bits += 8; bits >= 5; bits -= 5) { + output += ALPHABET[(value >>> (bits - 5)) & 31]; + } + } + + if (bits > 0) { + output += ALPHABET[(value << (5 - bits)) & 31]; + } + return output; +} diff --git a/src/kvstore/icechunk/decode_utils.ts b/src/kvstore/icechunk/decode_utils.ts new file mode 100644 index 0000000000..a09094fae9 --- /dev/null +++ b/src/kvstore/icechunk/decode_utils.ts @@ -0,0 +1,217 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Unpackr } from "msgpackr"; +import * as v from "valibot"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { crockfordBase32Encode } from "#src/kvstore/icechunk/crockford_base32.js"; + +export const LATEST_KNOWN_SPEC_VERSION = 1; + +// "ICE🧊CHUNK" as UTF-8 +const MAGIC = Uint8Array.of( + 0x49, + 0x43, + 0x45, + 0xf0, + 0x9f, + 0xa7, + 0x8a, + 0x43, + 0x48, + 0x55, + 0x4e, + 0x4b, +); + +const IMPLEMENTATION_NAME_LENGTH = 24; + +const ENVELOPE_HEADER_SIZE = + MAGIC.length + // magic + IMPLEMENTATION_NAME_LENGTH + // implementation name + 1 + // spec_version + 1 + // file type + 1; // compression + +export enum CompressionMethod { + UNCOMPRESSED = 0, + ZSTD = 1, +} + +export async function decodeEnvelope( + buffer: ArrayBuffer, + maxVersion: number, + fileType: number, + signal: AbortSignal, +): Promise<{ content: Uint8Array; specVersion: number }> { + if (buffer.byteLength < ENVELOPE_HEADER_SIZE) { + throw new Error( + `Expected icechunk header of ${ENVELOPE_HEADER_SIZE} bytes, but received: ${buffer.byteLength} bytes`, + ); + } + const dv = new DataView(buffer); + let offset = 0; + for (let i = 0, n = MAGIC.length; i < n; ++i) { + if (dv.getUint8(i) !== MAGIC[i]) { + throw new Error( + `Expected magic bytes of ${MAGIC.join()} but received: ${new Uint8Array(buffer, 0, n).join()}`, + ); + } + } + offset += MAGIC.length; + offset += IMPLEMENTATION_NAME_LENGTH; + const specVersion = dv.getUint8(offset++); + if (specVersion > maxVersion) { + throw new Error( + `Expected version <= ${maxVersion} but received: ${specVersion}`, + ); + } + const storedFileType = dv.getUint8(offset++); + if (storedFileType !== fileType) { + throw new Error( + `Expected file type of ${fileType}, but received: ${storedFileType}`, + ); + } + const compressionMethod = dv.getUint8(offset++); + let content = new Uint8Array(buffer, offset); + switch (compressionMethod) { + case CompressionMethod.UNCOMPRESSED: + break; + case CompressionMethod.ZSTD: + content = await requestAsyncComputation( + decodeZstd, + signal, + [buffer], + content, + ); + content = new Uint8Array( + content.buffer, + content.byteOffset, + content.byteLength, + ); + break; + default: + throw new Error(`Unknown compression method: ${compressionMethod}`); + } + + return { content, specVersion }; +} + +export interface DecodedIcechunkMessage { + content: unknown; + specVersion: number; + estimatedSize: number; +} + +export async function decodeMsgpack( + buffer: ArrayBuffer, + maxVersion: number, + fileType: number, + signal: AbortSignal, +): Promise { + const { content, specVersion } = await decodeEnvelope( + buffer, + maxVersion, + fileType, + signal, + ); + return { + content: new Unpackr({ + mapsAsObjects: false, + int64AsType: "bigint", + }).unpack(content), + specVersion, + estimatedSize: buffer.byteLength * 3, + }; +} + +const DataId = v.pipe( + v.tuple([v.instance(Uint8Array)]), + v.transform((obj) => obj[0]), +); + +export const DataId12 = v.pipe( + DataId, + v.length(12), + v.transform, string>(crockfordBase32Encode), +); +export const DataId8 = v.pipe( + DataId, + v.length(8), + v.transform, string>(crockfordBase32Encode), +); + +const MIN_SAFE_INTEGER_BIGINT = BigInt(Number.MIN_SAFE_INTEGER); +const MAX_SAFE_INTEGER_BIGINT = BigInt(Number.MAX_SAFE_INTEGER); + +const bigIntToSafeNumber = v.pipe( + v.bigint(), + v.check( + (x) => x >= MIN_SAFE_INTEGER_BIGINT && x <= MAX_SAFE_INTEGER_BIGINT, + `Number outside supported range: [${Number.MIN_SAFE_INTEGER}, ${Number.MAX_SAFE_INTEGER}]`, + ), + v.transform(Number), +); + +export const Integer = v.union([ + bigIntToSafeNumber, + v.pipe(v.number(), v.integer()), +]); + +export function tupleToObject( + entries: TEntries, +) { + const keys = Object.keys(entries); + return v.pipe( + v.array(v.any()), + v.length(keys.length), + v.transform((x: unknown[]) => + Object.fromEntries(keys.map((key, i) => [key, x[i]])), + ), + v.strictObject(entries), + ); +} + +export const ManifestId = DataId12; +export type ManifestId = v.InferOutput; +export const ChunkId = DataId12; +export type ChunkId = v.InferOutput; +export const NodeId = DataId8; +export type NodeId = v.InferOutput; + +export function parseDecodedMsgpack< + TOutput, + TIssue extends v.BaseIssue, +>( + schema: v.BaseSchema, + name: string, + decoded: DecodedIcechunkMessage, +): TOutput & { estimatedSize: number } { + try { + return { + ...v.parse(schema, decoded.content), + estimatedSize: decoded.estimatedSize, + }; + } catch (e) { + if (v.isValiError(e)) { + throw new Error( + `Error parsing icechunk ${name}: ${JSON.stringify(v.flatten(e.issues))}`, + ); + } + throw e; + } +} diff --git a/src/kvstore/icechunk/frontend.ts b/src/kvstore/icechunk/frontend.ts new file mode 100644 index 0000000000..11c243762b --- /dev/null +++ b/src/kvstore/icechunk/frontend.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { RefSpec } from "#src/kvstore/icechunk/url.js"; +import { getIcechunkUrl } from "#src/kvstore/icechunk/url.js"; +import type { KvStore } from "#src/kvstore/index.js"; +import { ProxyKvStore } from "#src/kvstore/proxy.js"; + +export class IcechunkKvStore extends ProxyKvStore implements KvStore { + constructor( + sharedKvStoreContext: SharedKvStoreContext, + public baseUrl: string, + public refSpec: RefSpec | undefined, + ) { + super(sharedKvStoreContext); + } + + getUrl(key: string) { + return getIcechunkUrl(this, key); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/icechunk/index.rst b/src/kvstore/icechunk/index.rst new file mode 100644 index 0000000000..279b47d786 --- /dev/null +++ b/src/kvstore/icechunk/index.rst @@ -0,0 +1,70 @@ +.. _icechunk-kvstore: + +Icechunk +======== + +The Icechunk :ref:`key-value store adapter` provides access to +an `Icechunk repository `__ containing a :ref:`Zarr +v3` hierarchy. + +URL syntax +---------- + +- :file:`{base-kvstore-url/}|icechunk:{path/to/array/}` +- :file:`{base-kvstore-url/}|icechunk:@branch.{BRANCH}/{path/to/array/}` +- :file:`{base-kvstore-url/}|icechunk:@tag.{TAG}/{path/to/array/}` +- :file:`{base-kvstore-url/}|icechunk:@{SNAPSHOT}/{path/to/array/}` + +The :file:`{base-kvstore-url/}` must refer to a directory. + +- The :file:`icechunk:{path/to/array/}` syntax is equivalent to + :file:`icechunk:@branch.main/{path/to/array/}`. + +- The :file:`icechunk:@branch.{BRANCH}/{path/to/array/}` syntax indicates the + latest version of the specified :file:`{BRANCH}`. + +- The :file:`icechunk:@tag.{TAG}/{path/to/array/}` syntax indicates a specific + tag. + +- The :file:`icechunk:@{SNAPSHOT}/{path/to/array/}` syntax indicates a specific + snapshot. + +Currently, icechunk can only store Zarr v3 hierarchies. Therefore, it is always +used in conjunction with the :ref:`Zarr data format driver`. + +For example: + +- ``gs://bucket/path/to/repo.zarr.icechunk/|icechunk:|zarr3:path/to/array/`` +- ``gs://bucket/path/to/repo.zarr.icechunk/|icechunk:@branch.other/|zarr3:path/to/array/`` +- ``gs://bucket/path/to/repo.zarr.icechunk/|icechunk:@tag.v5/|zarr3:path/to/array/`` +- ``gs://bucket/path/to/repo.zarr.icechunk/|icechunk:@4N0217AZA4VNPYD0HR0G/|zarr3:path/to/array/`` + +.. note:: + + Consistent with normal URL syntax, any special characters in the + :file:`{path}/{to}/{array/}`, including ``@`` which is used to specify a ref, + must be `percent-encoded `__. + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported. + * - :ref:`kvstore-listing` + - Supported. + +.. list-table:: Required capabilities of base key-value store + + * - :ref:`kvstore-byte-range-reads` + - Required. + * - :ref:`kvstore-listing` + - Required when a tag or snapshot is not specified explicitly. + +Auto detection +-------------- + +Directories containing Icechunk repositories are detected automatically based on +the presence of the :file:`refs` and :file:`snapshots` sub-directories, and by +the presence of the :file:`refs/branch.main/ZZZZZZZZ.json` file. diff --git a/src/kvstore/icechunk/list.ts b/src/kvstore/icechunk/list.ts new file mode 100644 index 0000000000..20db9ea175 --- /dev/null +++ b/src/kvstore/icechunk/list.ts @@ -0,0 +1,77 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Snapshot } from "#src/kvstore/icechunk/snapshot.js"; +import { + normalizeListResponse, + type ListResponse, +} from "#src/kvstore/index.js"; +import { binarySearch, binarySearchLowerBound } from "#src/util/array.js"; +import { defaultStringCompare } from "#src/util/string.js"; + +export function getListResponseFromSnapshot( + snapshot: Snapshot, + prefix: string, +): ListResponse { + const { nodes } = snapshot; + const startIndex = binarySearchLowerBound( + 0, + nodes.length, + (index) => nodes[index].path >= prefix, + ); + const endIndex = binarySearchLowerBound( + Math.min(nodes.length, startIndex + 1), + nodes.length, + (index) => !nodes[index].path.startsWith(prefix), + ); + const response: ListResponse = { entries: [], directories: [] }; + for (let index = startIndex; index < endIndex; ) { + const node = nodes[index]; + const { path } = node; + const i = path.indexOf("/", prefix.length); + if (i === -1) { + // Node must exactly match prefix. + ++index; + } else { + if (i + 1 === path.length) { + // Direct child node, include in results. + response.directories.push(path.slice(0, i)); + } + // Skip over non-direct descedant nodes. + const directoryPrefix = path.substring(0, i + 1); + index = binarySearchLowerBound( + index + 1, + endIndex, + (index) => !nodes[index].path.startsWith(directoryPrefix), + ); + } + } + + // Also add `zarr.json` file if it would match. + const lastSlash = prefix.lastIndexOf("/"); + if ("zarr.json".startsWith(prefix.slice(lastSlash + 1))) { + const parentPath = prefix.substring(0, lastSlash + 1); + const parentNodeIndex = binarySearch(nodes, parentPath, (path, node) => + defaultStringCompare(path, node.path), + ); + if (parentNodeIndex >= 0) { + response.entries.push({ key: parentPath + "zarr.json" }); + } else { + throw new Error(`Parent node ${JSON.stringify(parentPath)} not found`); + } + } + return normalizeListResponse(response); +} diff --git a/src/kvstore/icechunk/manifest.ts b/src/kvstore/icechunk/manifest.ts new file mode 100644 index 0000000000..60dbcf69a2 --- /dev/null +++ b/src/kvstore/icechunk/manifest.ts @@ -0,0 +1,102 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as v from "valibot"; +import { + ChunkId, + decodeMsgpack, + Integer, + LATEST_KNOWN_SPEC_VERSION, + ManifestId, + NodeId, + parseDecodedMsgpack, + tupleToObject, +} from "#src/kvstore/icechunk/decode_utils.js"; +import { pipelineUrlJoin } from "#src/kvstore/url.js"; + +const MANIFEST_FILE_TYPE = 2; + +const InlineChunkPayload = v.strictObject({ + Inline: v.instance(Uint8Array), +}); + +const Chunksum = v.any(); + +const VirtualChunkLocation = v.string(); + +const VirtualChunkRef = tupleToObject({ + location: VirtualChunkLocation, + offset: Integer, + length: Integer, + chunksum: Chunksum, +}); + +const VirtualChunkRefPayload = v.strictObject({ + Virtual: VirtualChunkRef, +}); + +const ChunkRef = tupleToObject({ + id: ChunkId, + offset: Integer, + length: Integer, +}); + +const ChunkRefPayload = v.strictObject({ + Ref: ChunkRef, +}); + +const ChunkPayload = v.pipe( + v.map(v.string(), v.any()), + v.transform, Record>(Object.fromEntries), + v.union([InlineChunkPayload, VirtualChunkRefPayload, ChunkRefPayload]), +); + +export type ChunkPayload = v.InferOutput; + +const Manifest = tupleToObject({ + id: ManifestId, + chunks: v.map( + NodeId, + v.map( + v.pipe( + v.array(Integer), + v.transform((chunk) => chunk.join()), + ), + ChunkPayload, + ), + ), +}); + +export type Manifest = v.InferOutput & { + estimatedSize: number; +}; + +export async function decodeManifest( + buffer: ArrayBuffer, + signal: AbortSignal, +): Promise { + const decoded = await decodeMsgpack( + buffer, + LATEST_KNOWN_SPEC_VERSION, + MANIFEST_FILE_TYPE, + signal, + ); + return parseDecodedMsgpack(Manifest, "chunk manifest", decoded); +} + +export function getManifestUrl(baseUrl: string, id: ManifestId): string { + return pipelineUrlJoin(baseUrl, `manifests/${id}`); +} diff --git a/src/kvstore/icechunk/metadata_cache.ts b/src/kvstore/icechunk/metadata_cache.ts new file mode 100644 index 0000000000..2b95204f98 --- /dev/null +++ b/src/kvstore/icechunk/metadata_cache.ts @@ -0,0 +1,249 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ManifestId } from "#src/kvstore/icechunk/decode_utils.js"; +import { + decodeManifest, + getManifestUrl, +} from "#src/kvstore/icechunk/manifest.js"; +import { decodeRef, isBranchRef } from "#src/kvstore/icechunk/ref.js"; +import type { SnapshotId } from "#src/kvstore/icechunk/snapshot.js"; +import { + decodeSnapshot, + getSnapshotUrl, +} from "#src/kvstore/icechunk/snapshot.js"; +import type { RefSpec } from "#src/kvstore/icechunk/url.js"; +import { pipelineUrlJoin } from "#src/kvstore/url.js"; +import { + ProgressSpan, + type ProgressOptions, +} from "#src/util/progress_listener.js"; + +function makeMetadataCache( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + description: string, + decode: ( + response: Response, + signal: AbortSignal, + ) => Promise<{ data: T; size: number }>, +) { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async (url: string, progressOptions: ProgressOptions) => { + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + url, + { + ...progressOptions, + throwIfMissing: true, + }, + ); + try { + return await decode(readResponse.response, progressOptions.signal); + } catch (e) { + throw new Error(`Error reading icechunk ${description} from ${url}`, { + cause: e, + }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; +} + +export function getSnapshot( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + id: SnapshotId, + options: Partial, +) { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "icechunk:snapshot", + () => + makeMetadataCache( + sharedKvStoreContext, + "snapshot", + async (response, signal) => { + const value = await decodeSnapshot( + await response.arrayBuffer(), + signal, + ); + return { data: value, size: value.estimatedSize }; + }, + ), + ); + return cache.get(getSnapshotUrl(baseUrl, id), options); +} + +export function getManifest( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + id: ManifestId, + options: Partial, +) { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "icechunk:manifest", + () => + makeMetadataCache( + sharedKvStoreContext, + "manifest", + async (response, signal) => { + const value = await decodeManifest( + await response.arrayBuffer(), + signal, + ); + return { data: value, size: value.estimatedSize }; + }, + ), + ); + return cache.get(getManifestUrl(baseUrl, id), options); +} + +export function getRef( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + options: Partial, +) { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "icechunk:ref", + () => + makeMetadataCache(sharedKvStoreContext, "ref", async (response) => ({ + data: decodeRef(await response.json()), + size: 0, + })), + ); + return cache.get(url, options); +} + +export function getBranch( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + options: Partial, +) { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "icechunk:branch", + () => { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async (url: string, progressOptions: ProgressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Resolving icechunk branch at ${url}`, + }); + try { + const listResponse = + await sharedKvStoreContext.kvStoreContext.list(url, { + ...progressOptions, + responseKeys: "suffix", + }); + const headKey = listResponse.entries.find((entry) => + isBranchRef(entry.key), + ); + if (headKey === undefined) { + throw new Error(`Failed to find any refs`); + } + const snapshotId = await getRef( + sharedKvStoreContext, + pipelineUrlJoin(url, headKey.key), + progressOptions, + ); + return { data: snapshotId, size: 0 }; + } catch (e) { + throw new Error(`Error resolving icechunk branch at ${url}`, { + cause: e, + }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get(url, options); +} + +export function getTag( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + options: Partial, +) { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "icechunk:tag", + () => { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async (url: string, progressOptions: ProgressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Resolving icechunk tag at ${url}`, + }); + try { + const [tagResponse, deletedResponse] = await Promise.all([ + getRef( + sharedKvStoreContext, + pipelineUrlJoin(url, "ref.json"), + progressOptions, + ), + sharedKvStoreContext.kvStoreContext.stat( + pipelineUrlJoin(url, "ref.json.deleted"), + progressOptions, + ), + ]); + if (deletedResponse !== undefined) { + throw new Error(`Tag is marked as deleted`); + } + return { data: tagResponse, size: 0 }; + } catch (e) { + throw new Error(`Error resolving icechunk tag at ${url}`, { + cause: e, + }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get(url, options); +} + +export function resolveRefSpec( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + refSpec: RefSpec, + options: Partial, +): Promise { + if ("snapshot" in refSpec) { + return Promise.resolve(refSpec.snapshot); + } + if ("branch" in refSpec) { + return getBranch( + sharedKvStoreContext, + pipelineUrlJoin(url, `refs/branch.${refSpec.branch}/`), + options, + ); + } + return getTag( + sharedKvStoreContext, + pipelineUrlJoin(url, `refs/tag.${refSpec.tag}/`), + options, + ); +} diff --git a/src/kvstore/icechunk/read.ts b/src/kvstore/icechunk/read.ts new file mode 100644 index 0000000000..fe6ac7e479 --- /dev/null +++ b/src/kvstore/icechunk/read.ts @@ -0,0 +1,216 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { + FileByteRangeHandle, + handleByteRangeRequestFromUint8Array, +} from "#src/kvstore/byte_range/file_handle.js"; +import type { ChunkId } from "#src/kvstore/icechunk/decode_utils.js"; +import type { ChunkPayload } from "#src/kvstore/icechunk/manifest.js"; +import { getManifest } from "#src/kvstore/icechunk/metadata_cache.js"; +import type { + ManifestExtents, + NodeDataArray, + NodeSnapshot, + Snapshot, +} from "#src/kvstore/icechunk/snapshot.js"; +import { encodeZarrJson, findNode } from "#src/kvstore/icechunk/snapshot.js"; +import type { + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { pipelineUrlJoin } from "#src/kvstore/url.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export interface ResolvedIcechunkPath { + node: NodeSnapshot; + chunk?: number[]; +} + +export function resolveIcechunkPath( + snapshot: Snapshot, + path: string, +): ResolvedIcechunkPath | undefined { + let nodePath: string; + let chunk: number[] | undefined; + const zarrJsonMatch = path.match(/(?:^|\/)(zarr\.json)$/); + if (zarrJsonMatch !== null) { + nodePath = path.slice(0, -zarrJsonMatch[1].length); + } else { + const chunkMatch = path.match(/c(?:[./][0-9]+)*$/); + if (chunkMatch === null) { + return undefined; + } + nodePath = path.slice(0, -chunkMatch[0].length); + const parts = chunkMatch[0].split(/[./]/); + const n = parts.length - 1; + chunk = new Array(n); + for (let i = 0; i < n; ++i) { + chunk[i] = Number(parts[i + 1]); + } + } + const node = findNode(snapshot, nodePath); + if (chunk === undefined) { + return { node }; + } + if (node.nodeData === "Group") { + // chunk path not valid for groups + return undefined; + } + const { shape, chunkShape } = node.nodeData.Array.metadata; + const rank = shape.length; + if (rank !== chunk.length) { + return undefined; + } + for (let i = 0; i < rank; ++i) { + if (chunk[i] * chunkShape[i] >= shape[i]) { + return undefined; + } + } + return { node, chunk }; +} + +function manifestExtentsContain( + [lower, upper]: ManifestExtents, + chunk: number[], +) { + for (let i = 0, n = chunk.length; i < n; ++i) { + const c = chunk[i]; + if (c < lower[i] || c >= upper[i]) return false; + } + return true; +} + +export async function resolveChunkPayload( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + node: NodeSnapshot, + chunk: number[], + options: Partial, +): Promise { + const { manifests } = (node.nodeData as NodeDataArray).Array; + const chunkKey = chunk.join(); + const nodeId = node.id; + for (const manifestRef of manifests) { + if (!manifestExtentsContain(manifestRef.extents, chunk)) continue; + const manifest = await getManifest( + sharedKvStoreContext, + baseUrl, + manifestRef.objectId, + options, + ); + const chunks = manifest.chunks.get(nodeId); + if (chunks === undefined) continue; + const chunkPayload = chunks.get(chunkKey); + if (chunkPayload !== undefined) return chunkPayload; + } + return undefined; +} + +export async function stat( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + snapshot: Snapshot, + path: string, + options: StatOptions, +): Promise { + const resolvedPath = resolveIcechunkPath(snapshot, path); + if (resolvedPath === undefined) return undefined; + const { node, chunk } = resolvedPath; + if (chunk === undefined) { + // zarr.json file. + return { totalSize: undefined }; + } + const payload = await resolveChunkPayload( + sharedKvStoreContext, + baseUrl, + node, + chunk, + options, + ); + if (payload === undefined) return undefined; + let totalSize: number; + if ("Inline" in payload) { + totalSize = payload.Inline.length; + } else if ("Virtual" in payload) { + totalSize = payload.Virtual.length; + } else { + totalSize = payload.Ref.length; + } + return { totalSize }; +} + +async function readFromChunkPayload( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + payload: ChunkPayload, + options: DriverReadOptions, +): Promise { + if ("Inline" in payload) { + return handleByteRangeRequestFromUint8Array( + payload.Inline, + options.byteRange, + ); + } + let offset: number; + let length: number; + let url: string; + if ("Virtual" in payload) { + ({ location: url, offset, length } = payload.Virtual); + } else { + const { Ref: ref } = payload; + ({ offset, length } = ref); + url = getChunkUrl(baseUrl, ref.id); + } + return new FileByteRangeHandle( + sharedKvStoreContext.kvStoreContext.getFileHandle(url), + { offset, length }, + ).read(options); +} + +function getChunkUrl(baseUrl: string, id: ChunkId) { + return pipelineUrlJoin(baseUrl, `chunks/${id}`); +} + +export async function read( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + baseUrl: string, + snapshot: Snapshot, + path: string, + options: DriverReadOptions, +): Promise { + const resolvedPath = resolveIcechunkPath(snapshot, path); + if (resolvedPath === undefined) return undefined; + const { node, chunk } = resolvedPath; + if (chunk === undefined) { + // zarr.json file. + const data = encodeZarrJson(node); + const encoded = new TextEncoder().encode(data); + return handleByteRangeRequestFromUint8Array(encoded, options.byteRange); + } + const payload = await resolveChunkPayload( + sharedKvStoreContext, + baseUrl, + node, + chunk, + options, + ); + if (payload === undefined) return undefined; + return readFromChunkPayload(sharedKvStoreContext, baseUrl, payload, options); +} diff --git a/src/kvstore/icechunk/ref.ts b/src/kvstore/icechunk/ref.ts new file mode 100644 index 0000000000..46e34c1f26 --- /dev/null +++ b/src/kvstore/icechunk/ref.ts @@ -0,0 +1,48 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; + +export function decodeRef(obj: unknown): string { + verifyObject(obj); + if (Object.keys(obj as object).length !== 1) { + throw new Error( + `Expected object with only a "snapshot" property, but received: ${JSON.stringify(obj)}`, + ); + } + const id = verifyObjectProperty(obj, "snapshot", verifyString); + if (!isSnapshotId(id)) { + throw new Error( + `Expected icechunk snapshot id but received: ${JSON.stringify(id)}`, + ); + } + return id; +} + +export function isSnapshotId(id: string) { + return id.match(/^[0-9ABCDEFGHJKMNPQRSTVWXYZ]{20}$/) !== null; +} + +// Checks if a given basename is a valid branch ref file. +export function isBranchRef(name: string): boolean { + // This is not strictly precise because this allows for any 100-bit value, + // while icechunk only allows for 96-bits. + return name.match(/^[0-9ABCDEFGHJKMNPQRSTVWXYZ]{8}\.json$/) !== null; +} diff --git a/src/kvstore/icechunk/register_backend.ts b/src/kvstore/icechunk/register_backend.ts new file mode 100644 index 0000000000..8ab987c46a --- /dev/null +++ b/src/kvstore/icechunk/register_backend.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { IcechunkKvStore } from "#src/kvstore/icechunk/backend.js"; +import { completeIcechunkUrl } from "#src/kvstore/icechunk/complete_url.js"; +import { parseIcechunkUrl } from "#src/kvstore/icechunk/url.js"; + +function icechunkProvider( + sharedKvStoreContext: SharedKvStoreContextCounterpart, +): KvStoreAdapterProvider { + return { + scheme: "icechunk", + description: "Icechunk repository", + getKvStore(parsedUrl, base) { + const { baseUrl, version, path } = parseIcechunkUrl(parsedUrl, base); + return { + store: new IcechunkKvStore(sharedKvStoreContext, baseUrl, version), + path, + }; + }, + + completeUrl(options) { + return completeIcechunkUrl(sharedKvStoreContext, options); + }, + }; +} + +backendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider( + icechunkProvider, +); diff --git a/src/kvstore/icechunk/register_frontend.ts b/src/kvstore/icechunk/register_frontend.ts new file mode 100644 index 0000000000..1928ed5004 --- /dev/null +++ b/src/kvstore/icechunk/register_frontend.ts @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + KvStoreAdapterProvider, + CompletionResult, + KvStoreAdapterCompleteUrlOptions, +} from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { registerAutoDetect } from "#src/kvstore/icechunk/auto_detect.js"; +import { IcechunkKvStore } from "#src/kvstore/icechunk/frontend.js"; +import { parseIcechunkUrl } from "#src/kvstore/icechunk/url.js"; +import { proxyCompleteUrl } from "#src/kvstore/proxy.js"; + +function icechunkProvider( + sharedKvStoreContext: SharedKvStoreContext, +): KvStoreAdapterProvider { + return { + scheme: "icechunk", + description: "Icechunk repository", + getKvStore(parsedUrl, base) { + const { baseUrl, version, path } = parseIcechunkUrl(parsedUrl, base); + return { + store: new IcechunkKvStore(sharedKvStoreContext, baseUrl, version), + path, + }; + }, + completeUrl( + options: KvStoreAdapterCompleteUrlOptions, + ): Promise { + const { base, url } = options; + return proxyCompleteUrl( + sharedKvStoreContext, + `${base.store.getUrl(base.path)}|${url.url}`, + options, + ); + }, + }; +} + +frontendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider( + icechunkProvider, +); + +registerAutoDetect(frontendOnlyKvStoreProviderRegistry.autoDetectRegistry); diff --git a/src/kvstore/icechunk/snapshot.ts b/src/kvstore/icechunk/snapshot.ts new file mode 100644 index 0000000000..b4adc7b0dd --- /dev/null +++ b/src/kvstore/icechunk/snapshot.ts @@ -0,0 +1,261 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as v from "valibot"; +import { + DataId12, + decodeMsgpack, + Integer, + LATEST_KNOWN_SPEC_VERSION, + ManifestId, + NodeId, + parseDecodedMsgpack, + tupleToObject, +} from "#src/kvstore/icechunk/decode_utils.js"; + +import { pipelineUrlJoin } from "#src/kvstore/url.js"; +import { binarySearch } from "#src/util/array.js"; +import { defaultStringCompare } from "#src/util/string.js"; + +const SNAPSHOT_FILE_TYPE = 1; +// const ATTRIBUTES_FILE_TYPE = 3; + +const SnapshotId = DataId12; +export type SnapshotId = v.InferOutput; +const AttributesId = DataId12; + +const ManifestFileInfo = tupleToObject({ + id: ManifestId, + sizeBytes: Integer, + numRows: Integer, +}); + +const AttributeFileInfo = tupleToObject({ + id: AttributesId, +}); + +// const UserAttributesRef = tupleToObject({ +// objectId: AttributesId, +// location: Integer, +// }); + +const UserAttributesSnapshot = v.pipe( + v.map(v.string(), v.any()), + v.transform, Record>(Object.fromEntries), + v.union([ + v.strictObject({ + Inline: v.any(), + }), + ]), + // v.map(v.picklist(["Ref"]), UserAttributesRef), +); + +const ChunkKeyEncoding = v.picklist(["Slash", "Dot"]); + +const Configuration = v.map(v.string(), v.any()); + +const Codec = tupleToObject({ + name: v.string(), + configuration: Configuration, +}); + +const FillValue = v.pipe( + v.map(v.string(), v.any()), + v.transform((obj) => { + const values = Array.from(obj.values()); + if (values.length !== 1) { + throw new Error( + `Expected a single key, but received: ${JSON.stringify(Array.from(obj.keys()))}`, + ); + } + return values[0]; + }), +); + +const StorageTransformer = tupleToObject({ + name: v.string(), + configuration: Configuration, +}); + +const DimensionNames = v.array(v.nullable(v.string())); + +const ZarrArrayMetadata = tupleToObject({ + shape: v.array(Integer), + dataType: v.string(), + chunkShape: v.array(Integer), + chunkKeyEncoding: ChunkKeyEncoding, + fillValue: FillValue, + codecs: v.array(Codec), + storageTransformers: v.array(StorageTransformer), + dimensionNames: v.nullable(DimensionNames), +}); + +export type ZarrArrayMetadata = v.InferOutput; + +const ChunkIndices = v.array(Integer); + +const ManifestExtents = v.strictTuple([ChunkIndices, ChunkIndices]); +export type ManifestExtents = v.InferOutput; +const ManifestRef = tupleToObject({ + objectId: ManifestId, + extents: ManifestExtents, +}); +export type ManifestRef = v.InferOutput; + +const NodeDataGroup = v.picklist(["Group"]); +const NodeDataArray = v.strictObject({ + Array: tupleToObject({ + metadata: ZarrArrayMetadata, + manifests: v.array(ManifestRef), + }), +}); +export type NodeDataArray = v.InferOutput; + +const NodeData = v.union([ + NodeDataGroup, + v.pipe( + v.map(v.string(), v.any()), + v.transform, Record>(Object.fromEntries), + NodeDataArray, + ), +]); + +const NodeSnapshot = tupleToObject({ + id: NodeId, + path: v.pipe( + v.string(), + v.transform((s) => (s === "/" ? "" : s.slice(1) + "/")), + ), + userAttributes: UserAttributesSnapshot, + nodeData: NodeData, +}); + +export type NodeSnapshot = v.InferOutput; + +const Nodes = v.pipe( + v.map(v.string(), NodeSnapshot), + v.transform((obj) => + Array.from(obj.values()).sort((a, b) => + defaultStringCompare(a.path, b.path), + ), + ), +); + +const Snapshot = tupleToObject({ + id: SnapshotId, + parentId: v.nullable(SnapshotId), + flushedAt: v.string(), + message: v.string(), + metadata: v.record(v.string(), v.any()), + manifestFiles: v.pipe( + v.array(ManifestFileInfo), + v.transform((obj) => { + const map = new Map(); + for (const entry of obj) { + map.set(entry.id, entry); + } + return map; + }), + ), + attributeFiles: v.array(AttributeFileInfo), + nodes: Nodes, +}); + +export type Snapshot = v.InferOutput & { + estimatedSize: number; +}; + +export async function decodeSnapshot( + buffer: ArrayBuffer, + signal: AbortSignal, +): Promise { + const decoded = await decodeMsgpack( + buffer, + LATEST_KNOWN_SPEC_VERSION, + SNAPSHOT_FILE_TYPE, + signal, + ); + return parseDecodedMsgpack(Snapshot, "snapshot", decoded); +} + +export function encodeZarrJson(node: NodeSnapshot) { + const { userAttributes, nodeData } = node; + let attributes: Map; + if (userAttributes === null) { + attributes = new Map(); + } else { + attributes = userAttributes.Inline; + } + + const obj = + nodeData !== "Group" + ? encodeArrayZarrJson(nodeData.Array.metadata, attributes) + : { zarr_format: 3, node_type: "group", attributes }; + + return JSON.stringify(obj, (_key, value) => { + if (value instanceof Map) { + return Object.fromEntries(value); + } + return value; + }); +} + +function encodeArrayZarrJson( + metadata: ZarrArrayMetadata, + attributes: Record, +) { + const { + shape, + chunkShape, + chunkKeyEncoding, + dataType, + fillValue, + codecs, + storageTransformers, + dimensionNames, + } = metadata; + return { + zarr_format: 3, + node_type: "array", + shape, + data_type: dataType, + chunk_grid: { name: "regular", configuration: { chunk_shape: chunkShape } }, + chunk_key_encoding: { + name: "default", + configuration: { separator: chunkKeyEncoding === "Dot" ? "." : "/" }, + }, + fill_value: fillValue, + codecs, + storage_transformers: storageTransformers, + dimension_names: dimensionNames ?? undefined, + attributes, + }; +} + +export function findNode(snapshot: Snapshot, path: string) { + const { nodes } = snapshot; + const index = binarySearch(nodes, path, (a, b) => + defaultStringCompare(a, b.path), + ); + if (index < 0) { + throw new Error(`Node not found: ${JSON.stringify(path)}`); + } + return nodes[index]; +} + +export function getSnapshotUrl(baseUrl: string, id: SnapshotId): string { + return pipelineUrlJoin(baseUrl, `snapshots/${id}`); +} diff --git a/src/kvstore/icechunk/url.ts b/src/kvstore/icechunk/url.ts new file mode 100644 index 0000000000..2b014cd90c --- /dev/null +++ b/src/kvstore/icechunk/url.ts @@ -0,0 +1,98 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { isSnapshotId } from "#src/kvstore/icechunk/ref.js"; +import type { KvStoreWithPath } from "#src/kvstore/index.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { + encodePathForUrl, + ensureNoQueryOrFragmentParameters, + ensurePathIsDirectory, +} from "#src/kvstore/url.js"; + +export type RefSpec = + | { snapshot: string } + | { branch: string } + | { tag: string }; + +const BRANCH_PREFIX = "branch."; +const TAG_PREFIX = "tag."; + +export function getIcechunkUrl( + options: { baseUrl: string; refSpec: RefSpec | undefined }, + key: string, +) { + const { baseUrl, refSpec } = options; + const versionString = + refSpec === undefined ? "" : `@${formatRefSpec(refSpec)}/`; + return baseUrl + `|icechunk:${versionString}${encodePathForUrl(key)}`; +} + +export function formatRefSpec(refSpec: RefSpec) { + if ("branch" in refSpec) { + return BRANCH_PREFIX + encodePathForUrl(refSpec.branch); + } + if ("tag" in refSpec) { + return TAG_PREFIX + encodePathForUrl(refSpec.tag); + } + return refSpec.snapshot; +} + +export function isValidBranchName(name: string) { + return name.length > 0 && !name.includes("/"); +} + +export function parseRefSpec( + versionString: string | undefined, +): RefSpec | undefined { + if (versionString === undefined) return undefined; + if (versionString.startsWith(BRANCH_PREFIX)) { + const branch = versionString.substring(BRANCH_PREFIX.length); + if (!isValidBranchName(branch)) { + throw new Error(`Invalid branch name: ${JSON.stringify(branch)}`); + } + return { branch: decodeURIComponent(branch) }; + } + if (versionString.startsWith(TAG_PREFIX)) { + const tag = versionString.substring(TAG_PREFIX.length); + if (!isValidBranchName(tag)) { + throw new Error(`Invalid tag name: ${JSON.stringify(tag)}`); + } + return { tag: decodeURIComponent(tag) }; + } + if (isSnapshotId(versionString)) { + return { snapshot: versionString }; + } + throw new Error(`Invalid ref spec: ${JSON.stringify(versionString)}`); +} + +export function parseIcechunkUrl( + parsedUrl: UrlWithParsedScheme, + base: KvStoreWithPath, +) { + ensureNoQueryOrFragmentParameters(parsedUrl); + try { + const m = (parsedUrl.suffix ?? "").match(/^(?:@([^/]*)(?:\/|$))?(.*)$/)!; + const [, refSpecString, path] = m; + return { + baseUrl: base.store.getUrl(ensurePathIsDirectory(base.path)), + version: parseRefSpec(refSpecString), + path: decodeURIComponent(path), + }; + } catch (e) { + throw new Error(`Invalid URL: ${parsedUrl.url}`, { cause: e }); + } +} diff --git a/src/kvstore/index.ts b/src/kvstore/index.ts index 68a3c663b5..e94f870efb 100644 --- a/src/kvstore/index.ts +++ b/src/kvstore/index.ts @@ -14,40 +14,14 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { defaultStringCompare } from "#src/util/string.js"; export interface ByteRange { offset: number; length: number; } -export function composeByteRangeRequest( - outer: ByteRange, - inner: ByteRangeRequest | undefined, -): { outer: ByteRange; inner: ByteRange } { - if (inner === undefined) { - return { outer, inner: { offset: 0, length: outer.length } }; - } - if ("suffixLength" in inner) { - const length = Math.min(outer.length, inner.suffixLength); - return { - outer: { offset: outer.offset + (outer.length - length), length }, - inner: { offset: outer.length - length, length }, - }; - } - if (inner.offset + inner.length > outer.length) { - throw new Error( - `Requested byte range ${JSON.stringify( - inner, - )} not valid for value of length ${outer.length}`, - ); - } - return { - outer: { offset: outer.offset + inner.offset, length: inner.length }, - inner, - }; -} - export type ByteRangeRequest = | ByteRange | { @@ -55,19 +29,33 @@ export type ByteRangeRequest = }; export interface ReadResponse { - data: Uint8Array; - dataRange: ByteRange; + response: Response; + offset: number; + length: number | undefined; totalSize: number | undefined; } -export interface ReadOptions { +export interface DriverReadOptions extends Partial { byteRange?: ByteRangeRequest; - cancellationToken?: CancellationToken; + throwIfMissing?: boolean; } -export interface ListOptions { - prefix: string; - cancellationToken?: CancellationToken; +export class NotFoundError extends Error { + constructor(handle: FileHandle, options?: { cause: any }) { + super(`${handle.getUrl()} not found`, options); + } +} + +export interface ReadOptions extends DriverReadOptions { + strictByteRange?: boolean; +} + +export type DriverListOptions = Partial; + +export type ListResponseKeyKind = "path" | "suffix" | "url"; + +export interface ListOptions extends DriverListOptions { + responseKeys?: ListResponseKeyKind; } export interface ListEntry { @@ -79,12 +67,210 @@ export interface ListResponse { directories: string[]; } +export interface StatOptions extends Partial { + throwIfMissing?: boolean; +} + +export interface StatResponse { + totalSize: number | undefined; +} + export interface ReadableKvStore { - read(key: Key, options: ReadOptions): Promise; + stat(key: Key, options: StatOptions): Promise; + read(key: Key, options: DriverReadOptions): Promise; + getUrl(key: Key): string; + + // Reads with non-zero byte offset are supported. + supportsOffsetReads: boolean; + + // Reads with `suffixLength` byte range are supported. + supportsSuffixReads: boolean; } export interface ListableKvStore { - list(options: ListOptions): Promise; + list?: (prefix: string, options: DriverListOptions) => Promise; +} + +export interface KvStore extends ReadableKvStore, ListableKvStore { + // Indicates that the only valid key is the empty string. + singleKey?: boolean; +} + +export interface KvStoreWithPath { + store: KvStore; + path: string; +} + +export function getKvStoreUrl(kvstore: KvStoreWithPath): string { + return kvstore.store.getUrl(kvstore.path); +} + +export function readKvStore( + store: ReadableKvStore, + key: Key, + options: ReadOptions & { throwIfMissing: true }, +): Promise; + +export function readKvStore( + store: ReadableKvStore, + key: Key, + options?: ReadOptions, +): Promise; + +export async function readKvStore( + store: ReadableKvStore, + key: Key, + options: ReadOptions = {}, +): Promise { + return readFileHandle(new KvStoreFileHandle(store, key), options); +} + +export function readFileHandle( + handle: FileHandle, + options: ReadOptions & { throwIfMissing: true }, +): Promise; + +export function readFileHandle( + handle: FileHandle, + options?: ReadOptions, +): Promise; + +export async function readFileHandle( + handle: FileHandle, + options: ReadOptions = {}, +): Promise { + const response = await handle.read(options); + if (options?.throwIfMissing === true) { + if (response === undefined) { + throw new NotFoundError(handle); + } + } + if (options?.strictByteRange === true && response !== undefined) { + const { byteRange } = options; + const { offset, length } = response; + if (byteRange !== undefined) { + if ( + "suffixLength" in byteRange + ? length !== byteRange.suffixLength + : offset !== byteRange.offset || + (length !== undefined && length !== byteRange.length) + ) { + throw new Error( + `Received truncated response for ${handle.getUrl()}, expected ${JSON.stringify( + byteRange, + )} but received offset=${offset}, length=${length}`, + ); + } + } + } + return response; +} + +function transformListResponse( + response: ListResponse, + prefix: string, + kvStore: KvStore, + responseKeys?: ListResponseKeyKind, +) { + switch (responseKeys) { + case "suffix": { + const offset = prefix.length; + return { + directories: response.directories.map((key) => key.substring(offset)), + entries: response.entries.map(({ key, ...entry }) => ({ + ...entry, + key: key.substring(offset), + })), + }; + } + case "url": { + return { + directories: response.directories.map((key) => kvStore.getUrl(key)), + entries: response.entries.map(({ key, ...entry }) => ({ + ...entry, + key: kvStore.getUrl(key), + })), + }; + } + default: { + return response; + } + } +} + +export async function listKvStore( + kvStore: KvStore, + prefix: string, + options: ListOptions = {}, +): Promise { + if (!kvStore.list) { + throw new Error("Listing not supported"); + } + return transformListResponse( + await kvStore.list(prefix, options), + prefix, + kvStore, + options.responseKeys, + ); +} + +export async function listKvStoreRecursively( + kvStore: KvStore, + prefix: string, + options: ListOptions = {}, +): Promise { + if (!kvStore.list) { + throw new Error("Listing not supported"); + } + const entries: ListEntry[] = []; + async function process(path: string) { + const response = await kvStore.list!(path, options); + entries.push(...response.entries); + await Promise.all(response.directories.map((name) => process(name + "/"))); + } + await process(prefix); + return transformListResponse( + normalizeListResponse({ entries, directories: [] }), + prefix, + kvStore, + options.responseKeys, + ).entries; +} + +export function kvStoreAppendPath( + kvstore: KvStoreWithPath, + suffix: string, +): KvStoreWithPath { + return { store: kvstore.store, path: kvstore.path + suffix }; } -export interface KvStore extends ReadableKvStore, ListableKvStore {} +export interface FileHandle { + stat(options: StatOptions): Promise; + read(options: DriverReadOptions): Promise; + getUrl(): string; +} + +export class KvStoreFileHandle implements FileHandle { + constructor( + public store: ReadableKvStore, + public key: Key, + ) {} + + stat(options: StatOptions): Promise { + return this.store.stat(this.key, options); + } + + read(options: DriverReadOptions): Promise { + return this.store.read(this.key, options); + } + + getUrl() { + return this.store.getUrl(this.key); + } +} + +export function normalizeListResponse(response: ListResponse): ListResponse { + response.entries.sort(({ key: a }, { key: b }) => defaultStringCompare(a, b)); + response.directories.sort(defaultStringCompare); + return response; +} diff --git a/src/kvstore/middleauth/common.ts b/src/kvstore/middleauth/common.ts new file mode 100644 index 0000000000..dd69621f97 --- /dev/null +++ b/src/kvstore/middleauth/common.ts @@ -0,0 +1,90 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchOkWithOAuth2CredentialsAdapter } from "#src/credentials_provider/oauth2.js"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import type { ReadableHttpKvStore } from "#src/kvstore/http/common.js"; +import type { + KvStoreProviderRegistry, + SharedKvStoreContextBase, +} from "#src/kvstore/register.js"; +import { getBaseHttpUrlAndPath } from "#src/kvstore/url.js"; + +const SCHEME_PREFIX = "middleauth+"; + +function getMiddleAuthCredentialsProvider( + credentialsManager: CredentialsManager, + url: string, +): CredentialsProvider { + return credentialsManager.getCredentialsProvider( + "middleauthapp", + new URL(url).origin, + ); +} + +function middleauthProvider< + SharedKvStoreContext extends SharedKvStoreContextBase, +>( + scheme: string, + context: SharedKvStoreContext, + httpKvStoreClass: typeof ReadableHttpKvStore, +): BaseKvStoreProvider { + return { + scheme: SCHEME_PREFIX + scheme, + description: `${scheme} with middleauth`, + getKvStore(url) { + const httpUrl = url.url.substring(SCHEME_PREFIX.length); + const credentialsProvider = getMiddleAuthCredentialsProvider( + context.credentialsManager, + httpUrl, + ); + try { + const { baseUrl, path } = getBaseHttpUrlAndPath(httpUrl); + return { + store: new httpKvStoreClass( + context, + baseUrl, + SCHEME_PREFIX + baseUrl, + fetchOkWithOAuth2CredentialsAdapter(credentialsProvider), + ), + path, + }; + } catch (e) { + throw new Error(`Invalid URL ${JSON.stringify(url.url)}`, { + cause: e, + }); + } + }, + }; +} + +export function registerProviders< + SharedKvStoreContext extends SharedKvStoreContextBase, +>( + registry: KvStoreProviderRegistry, + httpKvStoreClass: typeof ReadableHttpKvStore, +) { + for (const httpScheme of ["https"]) { + registry.registerBaseKvStoreProvider((context) => + middleauthProvider(httpScheme, context, httpKvStoreClass), + ); + } +} diff --git a/src/datasource/middleauth/credentials_provider.ts b/src/kvstore/middleauth/credentials_provider.ts similarity index 53% rename from src/datasource/middleauth/credentials_provider.ts rename to src/kvstore/middleauth/credentials_provider.ts index c5a6ab9995..25c5126051 100644 --- a/src/datasource/middleauth/credentials_provider.ts +++ b/src/kvstore/middleauth/credentials_provider.ts @@ -22,13 +22,19 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; +import { + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; import { StatusMessage } from "#src/status.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { verifyObject, verifyObjectProperty, verifyString, verifyStringArray, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; export type MiddleAuthToken = { tokenType: string; @@ -51,83 +57,68 @@ function openPopupCenter(url: string, width: number, height: number) { ); } -async function waitForLogin(serverUrl: string): Promise { - const status = new StatusMessage(/*delay=*/ false, /*modal=*/ true); - - const res: Promise = new Promise((f) => { - function writeLoginStatus(message: string, buttonMessage: string) { - status.element.textContent = message + " "; - const button = document.createElement("button"); - button.textContent = buttonMessage; - status.element.appendChild(button); - - button.addEventListener("click", () => { - writeLoginStatus( - `Waiting for login to middleauth server ${serverUrl}...`, - "Retry", - ); - - const auth_popup = openPopupCenter( - `${serverUrl}/api/v1/authorize`, - 400, - 650, - ); - - const closeAuthPopup = () => { - auth_popup?.close(); - }; - - window.addEventListener("beforeunload", closeAuthPopup); - const checkClosed = setInterval(() => { - if (auth_popup?.closed) { - clearInterval(checkClosed); - writeLoginStatus( - `Login window closed for middleauth server ${serverUrl}.`, - "Retry", - ); - } - }, 1000); - - const tokenListener = async (ev: MessageEvent) => { - if (ev.source === auth_popup) { - clearInterval(checkClosed); - window.removeEventListener("message", tokenListener); - window.removeEventListener("beforeunload", closeAuthPopup); - closeAuthPopup(); - - verifyObject(ev.data); - const accessToken = verifyObjectProperty( - ev.data, - "token", - verifyString, - ); - const appUrls = verifyObjectProperty( - ev.data, - "app_urls", - verifyStringArray, - ); - - const token: MiddleAuthToken = { - tokenType: "Bearer", - accessToken, - url: serverUrl, - appUrls, - }; - f(token); - } - }; - - window.addEventListener("message", tokenListener); - }); - } - - writeLoginStatus(`middleauth server ${serverUrl} login required.`, "Login"); +function waitForAuthResponseMessage( + serverUrl: string, + source: Window, + signal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event) => { + if (event.source !== source) return; + try { + const obj = verifyObject(event.data); + const accessToken = verifyObjectProperty(obj, "token", verifyString); + const appUrls = verifyObjectProperty( + obj, + "app_urls", + verifyStringArray, + ); + + const token: MiddleAuthToken = { + tokenType: "Bearer", + accessToken, + url: serverUrl, + appUrls, + }; + resolve(token); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); + } + }, + { signal: signal }, + ); }); +} +async function waitForLogin( + serverUrl: string, + signal: AbortSignal, +): Promise { + const abortController = new AbortController(); + signal = AbortSignal.any([abortController.signal, signal]); try { - return await res; + const newWindow = openPopupCenter( + `${serverUrl}/api/v1/authorize`, + 400, + 650, + ); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), + signal, + ); } finally { - status.dispose(); + abortController.abort(); } } @@ -154,19 +145,27 @@ export class MiddleAuthCredentialsProvider extends CredentialsProvider { + get = makeCredentialsGetter(async (options) => { let token = undefined; if (!this.alreadyTriedLocalStorage) { this.alreadyTriedLocalStorage = true; token = getAuthTokenFromLocalStorage(this.serverUrl); + if (token) return token; } - if (!token) { - token = await waitForLogin(this.serverUrl); - saveAuthTokenToLocalStorage(this.serverUrl, token); - } - + using _span = new ProgressSpan(options.progressListener, { + message: `Waiting for middleauth login to ${this.serverUrl}`, + }); + token = await getCredentialsWithStatus( + { + description: `middleauth server ${this.serverUrl}`, + requestDescription: "login", + get: (signal) => waitForLogin(this.serverUrl, signal), + }, + options.signal, + ); + saveAuthTokenToLocalStorage(this.serverUrl, token); return token; }); } @@ -191,16 +190,23 @@ export class MiddleAuthAppCredentialsProvider extends CredentialsProvider { - const authInfo = await fetch(`${this.serverUrl}/auth_info`).then((res) => - res.json(), - ); + get = makeCredentialsGetter(async (options) => { + let authInfo: any; + { + using _span = new ProgressSpan(options.progressListener, { + message: `Determining authentication server for ${this.serverUrl}`, + }); + const response = await fetch(`${this.serverUrl}/auth_info`, { + signal: options.signal, + }); + authInfo = await response.json(); + } const provider = this.credentialsManager.getCredentialsProvider( "middleauth", authInfo.login_url, ) as MiddleAuthCredentialsProvider; - this.credentials = await provider.get(this.credentials); + this.credentials = await provider.get(this.credentials, options); if (this.credentials.credentials.appUrls.includes(this.serverUrl)) { return this.credentials.credentials; diff --git a/src/kvstore/middleauth/register_backend.ts b/src/kvstore/middleauth/register_backend.ts new file mode 100644 index 0000000000..0efeeccf27 --- /dev/null +++ b/src/kvstore/middleauth/register_backend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import { HttpKvStore } from "#src/kvstore/http/backend.js"; +import { registerProviders } from "#src/kvstore/middleauth/common.js"; + +registerProviders(backendOnlyKvStoreProviderRegistry, HttpKvStore); diff --git a/src/datasource/middleauth/register_credentials_provider.ts b/src/kvstore/middleauth/register_credentials_provider.ts similarity index 75% rename from src/datasource/middleauth/register_credentials_provider.ts rename to src/kvstore/middleauth/register_credentials_provider.ts index 90f6a3b634..42ad01323e 100644 --- a/src/datasource/middleauth/register_credentials_provider.ts +++ b/src/kvstore/middleauth/register_credentials_provider.ts @@ -14,19 +14,19 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { MiddleAuthCredentialsProvider, MiddleAuthAppCredentialsProvider, -} from "#src/datasource/middleauth/credentials_provider.js"; +} from "#src/kvstore/middleauth/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "middleauth", - (serverUrl) => new MiddleAuthCredentialsProvider(serverUrl), + (serverUrl: string) => new MiddleAuthCredentialsProvider(serverUrl), ); -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "middleauthapp", (serverUrl: string, credentialsManager: CredentialsManager) => new MiddleAuthAppCredentialsProvider(serverUrl, credentialsManager), diff --git a/src/kvstore/middleauth/register_frontend.ts b/src/kvstore/middleauth/register_frontend.ts new file mode 100644 index 0000000000..c0e924107c --- /dev/null +++ b/src/kvstore/middleauth/register_frontend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { HttpKvStore } from "#src/kvstore/http/frontend.js"; +import { registerProviders } from "#src/kvstore/middleauth/common.js"; + +registerProviders(frontendOnlyKvStoreProviderRegistry, HttpKvStore); diff --git a/src/datasource/ngauth/README.md b/src/kvstore/ngauth/README.md similarity index 100% rename from src/datasource/ngauth/README.md rename to src/kvstore/ngauth/README.md diff --git a/src/kvstore/ngauth/credentials_provider.ts b/src/kvstore/ngauth/credentials_provider.ts new file mode 100644 index 0000000000..7d2208f0ee --- /dev/null +++ b/src/kvstore/ngauth/credentials_provider.ts @@ -0,0 +1,182 @@ +/** + * @license + * Copyright 2020 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { fetchOkWithCredentials } from "#src/credentials_provider/http_request.js"; +import { + CredentialsProvider, + makeCredentialsGetter, +} from "#src/credentials_provider/index.js"; +import { + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { raceWithAbort } from "#src/util/abort.js"; +import { fetchOk, HttpError } from "#src/util/http_request.js"; +import { + verifyObject, + verifyObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +function makeOriginError(serverUrl: string): Error { + return new Error( + `ngauth server ${serverUrl} ` + + `does not allow requests from Neuroglancer instance ${self.origin}`, + ); +} + +export interface Credentials { + token: string; +} + +async function waitForLogin( + serverUrl: string, + signal: AbortSignal, +): Promise { + const abortController = new AbortController(); + signal = AbortSignal.any([abortController.signal, signal]); + try { + const newWindow = window.open( + `${serverUrl}/login?origin=${encodeURIComponent(self.origin)}`, + ); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + return await raceWithAbort( + waitForAuthResponseMessage(serverUrl, newWindow, abortController.signal), + signal, + ); + } finally { + abortController.abort(); + } +} + +function waitForAuthResponseMessage( + serverUrl: string, + source: Window, + signal: AbortSignal, +): Promise { + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.source !== source) return; + const eventOrigin = + event.origin || ((event).originalEvent).origin; + if (eventOrigin !== serverUrl) { + return; + } + const { data } = event; + if (event.data === "badorigin") { + reject(makeOriginError(serverUrl)); + return; + } + try { + verifyObject(data); + const token = verifyObjectProperty(data, "token", verifyString); + resolve({ token }); + } catch (e) { + reject( + new Error( + `Received unexpected authentication response: ${e.message}`, + ), + ); + console.error( + "ngauth: Received unexpected message from ${serverUrl}", + event, + ); + } + }, + { signal: signal }, + ); + }); +} + +export class NgauthCredentialsProvider extends CredentialsProvider { + constructor(public serverUrl: string) { + super(); + } + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting ngauth login token from ${this.serverUrl}`, + }); + try { + const response = await fetchOk(`${this.serverUrl}/token`, { + method: "POST", + credentials: "include", + signal: options.signal, + }); + return { token: await response.text() }; + } catch (e) { + if (e instanceof HttpError) { + switch (e.status) { + case 401: + return await getCredentialsWithStatus( + { + description: `ngauth server ${this.serverUrl}`, + requestDescription: "login", + get: (signal) => waitForLogin(this.serverUrl, signal), + }, + options.signal, + ); + case 403: + throw makeOriginError(this.serverUrl); + } + } + throw e; + } + }); +} + +export class NgauthGcsCredentialsProvider extends CredentialsProvider { + constructor( + public ngauthCredentialsProvider: CredentialsProvider, + public serverUrl: string, + public bucket: string, + ) { + super(); + } + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting access token for gs://${this.bucket} from ${this.serverUrl}`, + }); + const response = await fetchOkWithCredentials( + this.ngauthCredentialsProvider, + `${this.serverUrl}/gcs_token`, + { method: "POST", signal: options.signal }, + (credentials, init) => { + return { + ...init, + body: JSON.stringify({ + token: credentials.token, + bucket: this.bucket, + }), + }; + }, + (error) => { + const { status } = error; + if (status === 401) { + return "refresh"; + } + throw error; + }, + ); + return { tokenType: "Bearer", accessToken: (await response.json()).token }; + }); +} diff --git a/src/kvstore/ngauth/register.ts b/src/kvstore/ngauth/register.ts new file mode 100644 index 0000000000..a7ef1067cf --- /dev/null +++ b/src/kvstore/ngauth/register.ts @@ -0,0 +1,84 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import pythonIntegration from "#python_integration_build"; +import type { + CredentialsManager, + CredentialsProvider, +} from "#src/credentials_provider/index.js"; +import type { OAuth2Credentials } from "#src/credentials_provider/oauth2.js"; +import { fetchOkWithOAuth2CredentialsAdapter } from "#src/credentials_provider/oauth2.js"; +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { GcsKvStore } from "#src/kvstore/gcs/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { frontendBackendIsomorphicKvStoreProviderRegistry } from "#src/kvstore/register.js"; + +function getNgauthCredentialsProvider( + credentialsManager: CredentialsManager, + authServer: string, + bucket: string, +): CredentialsProvider { + return pythonIntegration + ? credentialsManager.getCredentialsProvider("gcs", { bucket }) + : credentialsManager.getCredentialsProvider("ngauth_gcs", { + authServer: authServer, + bucket, + }); +} + +const SCHEME_PREFIX = "gs+ngauth+"; + +function gcsNgauthProvider( + scheme: string, + context: SharedKvStoreContextBase, +): BaseKvStoreProvider { + return { + scheme, + description: pythonIntegration + ? "Google Cloud Storage" + : "Google Cloud Storage (ngauth)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error( + `Invalid URL, expected ${url.scheme}:////`, + ); + } + const [, authHost, bucket, path] = m; + const authUrl = + url.scheme.substring(SCHEME_PREFIX.length) + "://" + authHost; + const credentialsProvider = getNgauthCredentialsProvider( + context.credentialsManager, + authUrl, + bucket, + ); + return { + store: new GcsKvStore( + bucket, + `${url.scheme}://${authHost}/${bucket}/`, + fetchOkWithOAuth2CredentialsAdapter(credentialsProvider), + ), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +for (const scheme of ["http", "https"]) { + frontendBackendIsomorphicKvStoreProviderRegistry.registerBaseKvStoreProvider( + (context) => gcsNgauthProvider(`${SCHEME_PREFIX}${scheme}`, context), + ); +} diff --git a/src/datasource/ngauth/register_credentials_provider.ts b/src/kvstore/ngauth/register_credentials_provider.ts similarity index 83% rename from src/datasource/ngauth/register_credentials_provider.ts rename to src/kvstore/ngauth/register_credentials_provider.ts index d500e1ee54..ff7ce554f7 100644 --- a/src/datasource/ngauth/register_credentials_provider.ts +++ b/src/kvstore/ngauth/register_credentials_provider.ts @@ -14,18 +14,18 @@ * limitations under the License. */ -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { registerDefaultCredentialsProvider } from "#src/credentials_provider/default_manager.js"; import type { CredentialsManager } from "#src/credentials_provider/index.js"; import { NgauthCredentialsProvider, NgauthGcsCredentialsProvider, -} from "#src/datasource/ngauth/credentials_provider.js"; +} from "#src/kvstore/ngauth/credentials_provider.js"; -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "ngauth", (serverUrl) => new NgauthCredentialsProvider(serverUrl), ); -defaultCredentialsManager.register( +registerDefaultCredentialsProvider( "ngauth_gcs", ( parameters: { authServer: string; bucket: string }, diff --git a/src/kvstore/ocdbt/async_computation.ts b/src/kvstore/ocdbt/async_computation.ts new file mode 100644 index 0000000000..d4f964f55f --- /dev/null +++ b/src/kvstore/ocdbt/async_computation.ts @@ -0,0 +1 @@ +import "#src/async_computation/decode_zstd.js"; diff --git a/src/kvstore/ocdbt/auto_detect.ts b/src/kvstore/ocdbt/auto_detect.ts new file mode 100644 index 0000000000..df4dc1e04b --- /dev/null +++ b/src/kvstore/ocdbt/auto_detect.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import { simpleFilePresenceAutoDetectDirectorySpec } from "#src/kvstore/auto_detect.js"; + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerDirectoryFormat( + simpleFilePresenceAutoDetectDirectorySpec(new Set(["manifest.ocdbt"]), { + suffix: "ocdbt:", + description: "OCDBT database", + }), + ); +} diff --git a/src/kvstore/ocdbt/backend.ts b/src/kvstore/ocdbt/backend.ts new file mode 100644 index 0000000000..24486f57f8 --- /dev/null +++ b/src/kvstore/ocdbt/backend.ts @@ -0,0 +1,124 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/proxy.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { + DriverListOptions, + DriverReadOptions, + KvStore, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { Key } from "#src/kvstore/ocdbt/key.js"; +import { listRoot } from "#src/kvstore/ocdbt/list.js"; +import { + findEntryInRoot, + readFromLeafNodeEntry, +} from "#src/kvstore/ocdbt/read.js"; +import { getRoot } from "#src/kvstore/ocdbt/read_version.js"; +import { getOcdbtUrl } from "#src/kvstore/ocdbt/url.js"; +import { type VersionSpecifier } from "#src/kvstore/ocdbt/version_specifier.js"; +import type { BtreeGenerationReference } from "#src/kvstore/ocdbt/version_tree.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export class OcdbtKvStore implements KvStore { + constructor( + public sharedKvStoreContext: SharedKvStoreContextCounterpart, + public baseUrl: string, + public version: VersionSpecifier | undefined, + ) {} + + private root: BtreeGenerationReference | undefined; + + private async getRoot(options: Partial) { + let { root } = this; + if (root === undefined) { + root = this.root = await getRoot( + this.sharedKvStoreContext, + this.baseUrl, + this.version, + options, + ); + } + return root; + } + + getUrl(key: string) { + return getOcdbtUrl(this, key); + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const root = await this.getRoot(options); + const encodedKey = new TextEncoder().encode(key) as Key; + const entry = await findEntryInRoot( + this.sharedKvStoreContext, + root, + encodedKey, + options, + ); + if (entry === undefined) return undefined; + const { value } = entry; + const totalSize = Number(value.length); + return { totalSize }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const root = await this.getRoot(options); + const encodedKey = new TextEncoder().encode(key) as Key; + const entry = await findEntryInRoot( + this.sharedKvStoreContext, + root, + encodedKey, + options, + ); + if (entry === undefined) return undefined; + return await readFromLeafNodeEntry( + this.sharedKvStoreContext, + entry, + options, + ); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const root = await this.getRoot(options); + const encodedPrefix = new TextEncoder().encode(prefix) as Key; + return await listRoot( + this.sharedKvStoreContext, + root, + encodedPrefix, + options, + ); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/ocdbt/btree.ts b/src/kvstore/ocdbt/btree.ts new file mode 100644 index 0000000000..cc44147e81 --- /dev/null +++ b/src/kvstore/ocdbt/btree.ts @@ -0,0 +1,474 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Reader } from "#src/kvstore/ocdbt/decode_utils.js"; +import { + readStructOfArrays, + decodeEnvelope, + readUint8, + readLeb128, + readLeb128Bounded, + readArrayOf, + readLeb128Bigint, + toArrayOfStructs, + readBytes, +} from "#src/kvstore/ocdbt/decode_utils.js"; +import type { + DataFileTable, + IndirectDataReference, + ReadIndirectDataReferenceOptions, +} from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import { + readDataFileId, + readDataFileTable, + readIndirectDataReferences, +} from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { Key } from "#src/kvstore/ocdbt/key.js"; +import { + compareArraysLexicographically, + findFirstMismatch, + keyStartsWith, +} from "#src/kvstore/ocdbt/key.js"; +import { binarySearch, binarySearchLowerBound } from "#src/util/array.js"; + +export type BtreeLeafNodeValueReference = + | Uint8Array + | IndirectDataReference; + +export interface BtreeLeafNodeEntry { + key: Uint8Array; + value: BtreeLeafNodeValueReference; +} + +export interface BtreeInteriorNodeEntry { + key: Uint8Array; + subtreeCommonPrefixLength: number; + node: BtreeNodeReference; +} + +export interface BtreeNode { + height: BtreeNodeHeight; + keyPrefix: Uint8Array; + entries: BtreeLeafNodeEntry[] | BtreeInteriorNodeEntry[]; + estimatedSize: number; +} + +export type BtreeNodeHeight = number; + +export interface BtreeNodeReference { + location: IndirectDataReference; + statistics: BtreeNodeStatistics; +} + +export interface BtreeNodeStatistics { + numIndirectValueBytes: bigint; + numTreeBytes: bigint; + numKeys: bigint; +} + +const BTREE_NODE_MAGIC_VALUE = 0x0cdb20de; +const BTREE_NODE_FORMAT_VERSION = 0; +const MAX_BTREE_NODE_ARITY = 1024 * 1024; + +export async function decodeBtreeNode( + buffer: ArrayBuffer, + baseUrl: string, + signal: AbortSignal, +): Promise { + try { + const { reader } = await decodeEnvelope( + buffer, + BTREE_NODE_MAGIC_VALUE, + BTREE_NODE_FORMAT_VERSION, + signal, + ); + const height = readUint8(reader); + const dataFileTable = readDataFileTable(reader, baseUrl); + const numEntries = readLeb128(reader); + if (numEntries === 0) { + throw new Error(`Empty b+tree node`); + } + if (numEntries > MAX_BTREE_NODE_ARITY) { + throw new Error( + `B+tree node has arity ${numEntries}, which exceeds limit of ${MAX_BTREE_NODE_ARITY}`, + ); + } + + return { + height, + ...(height === 0 + ? readBtreeLeafNodeEntries(reader, dataFileTable, numEntries) + : readBtreeInteriorNodeEntries(reader, dataFileTable, numEntries)), + estimatedSize: reader.data.byteLength * 3, + }; + } catch (e) { + throw new Error(`Error decoding OCDBT b+tree node`, { cause: e }); + } +} + +const MAX_KEY_LENGTH = 0xffff; + +function readKeyLength(reader: Reader): number { + return readLeb128Bounded(reader, MAX_KEY_LENGTH); +} + +function readKeys( + reader: Reader, + count: number, + interiorNode: IsInteriorNode, +): { + commonPrefix: Key; + keys: Key[]; + subtreeCommonPrefixLengths: IsInteriorNode extends true + ? Uint16Array + : undefined; +} { + const keyLengthBuffer = new Uint16Array(count * 2); + for (let i = 1, n = keyLengthBuffer.length; i < n; ++i) { + keyLengthBuffer[i] = readKeyLength(reader); + } + // common prefix limited to length of first key + let commonPrefixLength = keyLengthBuffer[count]; + for (let i = 1; i < count; ++i) { + commonPrefixLength = Math.min(commonPrefixLength, keyLengthBuffer[i]); + } + let subtreeCommonPrefixLengths: Uint16Array | undefined; + if (interiorNode) { + subtreeCommonPrefixLengths = new Uint16Array(count); + for (let i = 0; i < count; ++i) { + const x = (subtreeCommonPrefixLengths[i] = readKeyLength(reader)); + commonPrefixLength = Math.min(commonPrefixLength, x); + } + } + commonPrefixLength = Math.min(keyLengthBuffer[count], commonPrefixLength); + + for (let i = 0, prevLength = 0; i < count; ++i) { + const prefixLength = keyLengthBuffer[i]; + if (prefixLength > prevLength) { + throw new Error( + `Child ${i}: Prefix length of ${prefixLength} exceeds previous key length ${prevLength}`, + ); + } + const suffixLength = keyLengthBuffer[i + count]; + const keyLength = prefixLength + suffixLength; + if (keyLength > MAX_KEY_LENGTH) { + throw new Error( + `Child ${i}: Key length ${keyLength} exceeds limit of ${MAX_KEY_LENGTH}`, + ); + } + if (interiorNode) { + const subtreeCommonPrefixLength = subtreeCommonPrefixLengths![i]; + if (subtreeCommonPrefixLength > keyLength) { + throw new Error( + `Child ${i}: subtree common prefix length of ${subtreeCommonPrefixLength} exceeds key length of ${keyLength}`, + ); + } + subtreeCommonPrefixLengths![i] -= commonPrefixLength; + } + prevLength = keyLength; + } + + const keys = new Array(count); + + let commonPrefix: Key; + + // Read first `key_suffix` and extract common prefix. + { + const keyLength = keyLengthBuffer[count]; + const key = readBytes(reader, keyLength); + commonPrefix = key.slice(0, commonPrefixLength); + keys[0] = key.slice(commonPrefixLength); + } + + for (let i = 1; i < count; ++i) { + const prefixLength = keyLengthBuffer[i] - commonPrefixLength; + const suffixLength = keyLengthBuffer[i + count]; + const suffix = readBytes(reader, suffixLength); + const prevKey = keys[i - 1]; + if ( + compareArraysLexicographically(prevKey.subarray(prefixLength), suffix) >= + 0 + ) { + throw new Error(`Invalid key order`); + } + const key = new Uint8Array(prefixLength + suffixLength); + key.set(prevKey.subarray(0, prefixLength)); + key.set(suffix, prefixLength); + keys[i] = key; + } + + return { + keys, + subtreeCommonPrefixLengths: + subtreeCommonPrefixLengths as IsInteriorNode extends true + ? Uint16Array + : undefined, + commonPrefix, + }; +} + +enum LeafNodeValueKind { + INLINE_VALUE = 0, + OUT_OF_LINE_VALUE = 1, +} + +const MAX_INLINE_VALUE_LENGTH = 1024 * 1024; + +function readLeafNodeValueReferences( + reader: Reader, + dataFileTable: DataFileTable, + numEntries: number, +): BtreeLeafNodeValueReference[] { + const lengths = readArrayOf(readLeb128Bigint)(reader, numEntries, {}); + const valueKinds = readBytes(reader, numEntries); + for (let i = 0; i < numEntries; ++i) { + const valueKind = valueKinds[i]; + if (valueKind > LeafNodeValueKind.OUT_OF_LINE_VALUE) { + throw new Error( + `value_kind[${i}]=${valueKind} is outside valid range [0, ${LeafNodeValueKind.OUT_OF_LINE_VALUE}]`, + ); + } + if (valueKind === LeafNodeValueKind.INLINE_VALUE) { + const length = lengths[i]; + if (length > BigInt(MAX_INLINE_VALUE_LENGTH)) { + throw new Error( + `value_length[${i}]=${length} exceeds maximum of ${MAX_INLINE_VALUE_LENGTH} for an inline value`, + ); + } + } + } + + const values = new Array(numEntries); + + // Read data file ids for indirect values. + for (let i = 0; i < numEntries; ++i) { + if (valueKinds[i] !== LeafNodeValueKind.OUT_OF_LINE_VALUE) continue; + const dataFile = readDataFileId(reader, { dataFileTable }); + values[i] = { + dataFile, + offset: 0n, + length: lengths[i], + }; + } + + // Read offsets for indirect values. + for (let i = 0; i < numEntries; ++i) { + if (valueKinds[i] !== LeafNodeValueKind.OUT_OF_LINE_VALUE) continue; + const offset = readLeb128Bigint(reader); + (values[i] as IndirectDataReference).offset = offset; + } + + // Read inline values. + for (let i = 0; i < numEntries; ++i) { + if (valueKinds[i] !== LeafNodeValueKind.INLINE_VALUE) continue; + values[i] = readBytes(reader, Number(lengths[i])); + } + + return values; +} + +function readBtreeLeafNodeEntries( + reader: Reader, + dataFileTable: DataFileTable, + numEntries: number, +): { keyPrefix: Key; entries: BtreeLeafNodeEntry[] } { + const { keys, commonPrefix } = readKeys( + reader, + numEntries, + /*interiorNode=*/ false, + ); + + const values = readLeafNodeValueReferences(reader, dataFileTable, numEntries); + + return { + keyPrefix: commonPrefix, + entries: toArrayOfStructs(numEntries, { + key: keys, + value: values, + }), + }; +} + +function readBtreeInteriorNodeEntries( + reader: Reader, + dataFileTable: DataFileTable, + numEntries: number, +): { keyPrefix: Key; entries: BtreeInteriorNodeEntry[] } { + const { keys, commonPrefix, subtreeCommonPrefixLengths } = readKeys( + reader, + numEntries, + /*interiorNode=*/ true, + ); + + const nodes = readBtreeNodeReferences(reader, numEntries, { dataFileTable }); + return { + keyPrefix: commonPrefix, + entries: toArrayOfStructs(numEntries, { + key: keys, + subtreeCommonPrefixLength: subtreeCommonPrefixLengths, + node: nodes, + }), + }; +} + +const readBtreeNodeStatistics = readStructOfArrays({ + numKeys: readArrayOf(readLeb128Bigint), + numTreeBytes: readArrayOf(readLeb128Bigint), + numIndirectValueBytes: readArrayOf(readLeb128Bigint), +}); + +export const readBtreeNodeReferences = readStructOfArrays< + BtreeNodeReference, + ReadIndirectDataReferenceOptions +>({ + location: readIndirectDataReferences, + statistics: readBtreeNodeStatistics, +}); + +export function validateBtreeNodeReference( + node: BtreeNode, + height: BtreeNodeHeight, + inclusiveMinKey: Key, +) { + if (node.height !== height) { + throw new Error(`Expected height of ${height} but received ${node.height}`); + } + const { keyPrefix } = node; + if (inclusiveMinKey.length < keyPrefix.length) { + if (compareArraysLexicographically(keyPrefix, inclusiveMinKey) >= 0) { + return; + } + } else { + const c = compareArraysLexicographically( + keyPrefix, + inclusiveMinKey.subarray(0, keyPrefix.length), + ); + if (c >= 0) { + if ( + compareArraysLexicographically( + node.entries[0].key, + inclusiveMinKey.subarray(keyPrefix.length), + ) >= 0 + ) { + return; + } + } + } + throw new Error( + `First key [${keyPrefix}]+[${node.entries[0].key}] < inclusive_min [${inclusiveMinKey}] specified by parent node`, + ); +} + +export function findBtreeInteriorEntryLowerBound( + entries: BtreeInteriorNodeEntry[], + inclusiveMin: Key, +) { + // Find first entry with key *after* inclusiveMin. + const index = binarySearchLowerBound( + 0, + entries.length, + (i) => compareArraysLexicographically(entries[i].key, inclusiveMin) > 0, + ); + return Math.max(0, index - 1); +} + +export function findBtreeLeafEntryLowerBound( + entries: BtreeNode["entries"], + inclusiveMin: Key, +) { + return binarySearchLowerBound( + 0, + entries.length, + (i) => compareArraysLexicographically(entries[i].key, inclusiveMin) >= 0, + ); +} + +export function findBtreeInteriorEntryPrefixRange( + entries: BtreeInteriorNodeEntry[], + prefix: Key, +): [number, number] { + const lower = findBtreeInteriorEntryLowerBound(entries, prefix); + const upper = findBtreeEntryPrefixUpperBound( + entries, + lower, + entries.length, + prefix, + ); + return [lower, upper]; +} + +export function findBtreeEntryPrefixUpperBound( + entries: BtreeNode["entries"], + lower: number, + upper: number, + prefix: Key, +) { + if (lower === upper || prefix.length === 0) return upper; + return binarySearchLowerBound(lower, upper, (i) => { + const { offset, difference } = findFirstMismatch(prefix, entries[i].key); + return difference < 0 && offset < prefix.length; + }); +} + +export function findBtreeLeafEntryPrefixRange( + entries: BtreeLeafNodeEntry[], + prefix: Key, +): [number, number] { + const lower = findBtreeLeafEntryLowerBound(entries, prefix); + const upper = findBtreeEntryPrefixUpperBound( + entries, + lower, + entries.length, + prefix, + ); + return [lower, upper]; +} + +export function findBtreeLeafEntry( + entries: BtreeLeafNodeEntry[], + key: Key, +): BtreeLeafNodeEntry | undefined { + const index = binarySearch(entries, key, (a, b) => + compareArraysLexicographically(a, b.key), + ); + if (index < 0) return undefined; + return entries[index]; +} + +export function findBtreeInteriorEntry( + entries: BtreeInteriorNodeEntry[], + key: Key, +): BtreeInteriorNodeEntry | undefined { + // Find first entry that is *after* key. + const index = binarySearchLowerBound( + 0, + entries.length, + (i) => compareArraysLexicographically(entries[i].key, key) > 0, + ); + if (index === 0) { + // First entry is already *after* key, which means key is not present. + return undefined; + } + const entry = entries[index - 1]; + const { subtreeCommonPrefixLength } = entry; + if ( + subtreeCommonPrefixLength !== 0 && + !keyStartsWith(key, entry.key.subarray(0, subtreeCommonPrefixLength)) + ) { + return undefined; + } + return entry; +} diff --git a/src/kvstore/ocdbt/complete_url.ts b/src/kvstore/ocdbt/complete_url.ts new file mode 100644 index 0000000000..b1577b37fb --- /dev/null +++ b/src/kvstore/ocdbt/complete_url.ts @@ -0,0 +1,153 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { + CompletionResult, + KvStoreAdapterCompleteUrlOptions, +} from "#src/kvstore/context.js"; +import { listVersions } from "#src/kvstore/ocdbt/list_versions.js"; +import type { ManifestWithVersionTree } from "#src/kvstore/ocdbt/manifest.js"; +import { getResolvedManifest } from "#src/kvstore/ocdbt/metadata_cache.js"; +import { + findVersionIndexByLowerBound, + findVersionIndexByUpperBound, +} from "#src/kvstore/ocdbt/read_version.js"; +import { + formatCommitTime, + parseCommitTimePrefix, + parseVersion, +} from "#src/kvstore/ocdbt/version_specifier.js"; +import type { + BtreeGenerationReference, + GenerationIndex, +} from "#src/kvstore/ocdbt/version_tree.js"; +import { ensurePathIsDirectory } from "#src/kvstore/url.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +async function listVersionsLimited( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + minGenerationIndex: GenerationIndex, + maxGenerationIndex: GenerationIndex, + limit: GenerationIndex, + options: Partial, +): Promise { + if (maxGenerationIndex <= minGenerationIndex + limit) { + const { versions } = await listVersions(sharedKvStoreContext, manifest, { + inclusiveMin: { generationIndex: minGenerationIndex }, + exclusiveMax: { generationIndex: maxGenerationIndex }, + ...options, + }); + return versions; + } + + const [{ versions: lowerVersions }, { versions: upperVersions }] = + await Promise.all( + [minGenerationIndex, maxGenerationIndex - limit / 2n].map( + (generationIndex) => + listVersions(sharedKvStoreContext, manifest, { + inclusiveMin: { generationIndex }, + exclusiveMax: { generationIndex: generationIndex + limit / 2n }, + ...options, + }), + ), + ); + + return [...lowerVersions, ...upperVersions]; +} + +export async function completeOcdbtUrl( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + options: KvStoreAdapterCompleteUrlOptions, +): Promise { + const { url } = options; + const suffix = url.suffix ?? ""; + if (suffix === "") { + return { + offset: 0, + completions: [{ value: "@", description: "Version specifier" }], + }; + } + const m = suffix.match(/^@([^/]*)((?:\/|$).*)/); + if (m === null) return undefined; + const [, version, rest] = m; + if (rest !== "") { + parseVersion(version); + return undefined; + } + + const { base } = options; + const baseUrl = base.store.getUrl(ensurePathIsDirectory(base.path)); + if (!version.startsWith("v")) { + const [inclusiveMin, inclusiveMax] = parseCommitTimePrefix(version); + const progressOptions = { + signal: options.signal, + progressListener: options.progressListener, + }; + const manifest = await getResolvedManifest( + sharedKvStoreContext, + baseUrl, + progressOptions, + ); + const [minVersion, maxVersion] = await Promise.all([ + findVersionIndexByLowerBound( + sharedKvStoreContext, + manifest, + { commitTime: inclusiveMin }, + progressOptions, + ), + findVersionIndexByUpperBound( + sharedKvStoreContext, + manifest, + { commitTime: inclusiveMax + 1n }, + progressOptions, + ), + ]); + const versions = await listVersionsLimited( + sharedKvStoreContext, + manifest, + minVersion, + maxVersion, + 100n, + { + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const completions = versions.map((version) => ({ + value: `${formatCommitTime(version.commitTime)}/`, + description: `v${version.generationNumber}`, + })); + completions.reverse(); + return { offset: 1, completions }; + } + if (version === "v") { + const { base } = options; + const manifest = await getResolvedManifest( + sharedKvStoreContext, + base.store.getUrl(base.path), + options, + ); + const completions = manifest.versionTree.inlineVersions.map((ref) => ({ + value: `v${ref.generationNumber}/`, + description: formatCommitTime(ref.commitTime), + })); + completions.reverse(); + return { offset: 1, completions }; + } + return { offset: 1, completions: [{ value: `${version}/` }] }; +} diff --git a/src/kvstore/ocdbt/decode_utils.ts b/src/kvstore/ocdbt/decode_utils.ts new file mode 100644 index 0000000000..83016a293e --- /dev/null +++ b/src/kvstore/ocdbt/decode_utils.ts @@ -0,0 +1,234 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { buf as crc32cbuf } from "crc-32/crc32c.js"; +import { decodeZstd } from "#src/async_computation/decode_zstd_request.js"; +import { requestAsyncComputation } from "#src/async_computation/request.js"; +import { decodeLeb128, decodeLeb128Bigint } from "#src/util/leb128.js"; + +export enum CompressionMethod { + UNCOMPRESSED = 0, + ZSTD = 1, +} + +export async function decodeEnvelope( + buffer: ArrayBuffer, + expectedMagic: number, + maxVersion: number, + signal: AbortSignal, +): Promise<{ + reader: Reader; + version: number; +}> { + if (buffer.byteLength < 4 + 8 + 4 + 2) { + throw new Error("Unexpected EOF"); + } + const dv = new DataView(buffer); + const magic = dv.getUint32(0, /*littleEndian=*/ false); + if (magic !== expectedMagic) { + throw new Error( + `Expected magic value 0x${expectedMagic.toString(16)} but received 0x${magic.toString(16)}`, + ); + } + const length = dv.getBigUint64(4, /*littleEndian=*/ true); + if (length != BigInt(buffer.byteLength)) { + throw new Error( + `Expected length ${buffer.byteLength} but received: ${length}`, + ); + } + + const checksum = dv.getUint32(buffer.byteLength - 4, /*littleEndian=*/ true); + const actualChecksum = + crc32cbuf(new Uint8Array(buffer, 0, buffer.byteLength - 4)) >>> 0; + if (checksum != actualChecksum) { + throw new Error( + `Expected CRC32c checksum of ${checksum}, but received ${actualChecksum}`, + ); + } + + // Technically this is a varint, but all currentl-supported values are 1 byte. + const version = dv.getUint8(12); + if (version > maxVersion) { + throw new Error( + `Expected version to be <= ${maxVersion}, but received: ${version}`, + ); + } + + const compressionFormat = dv.getUint8(13); + let content = new Uint8Array(buffer, 14, buffer.byteLength - 14 - 4); + switch (compressionFormat) { + case CompressionMethod.UNCOMPRESSED: + // uncompressed + break; + case CompressionMethod.ZSTD: + // zstd + content = await requestAsyncComputation( + decodeZstd, + signal, + [buffer], + content, + ); + break; + default: + throw new Error(`Unknown compression format ${compressionFormat}`); + } + return { + reader: { + offset: 0, + data: new DataView( + content.buffer, + content.byteOffset, + content.byteLength, + ), + }, + version, + }; +} + +export interface Reader { + offset: number; + data: DataView; +} + +export function readBytes( + reader: Reader, + count: number, +): Uint8Array { + const { offset, data } = reader; + if (offset + count > data.byteLength) { + throw new Error(`Unexpected EOF`); + } + reader.offset += count; + return new Uint8Array(data.buffer, data.byteOffset + offset, count); +} + +export function readLeb128(reader: Reader): number { + const { value, offset } = decodeLeb128(reader.data, reader.offset); + reader.offset = offset; + return value; +} + +export function readLeb128Bigint(reader: Reader): bigint { + const { value, offset } = decodeLeb128Bigint(reader.data, reader.offset); + reader.offset = offset; + return value; +} + +export function readLeb128Bounded(reader: Reader, maxValue: number): number { + const value = readLeb128(reader); + if (value > maxValue) { + throw new Error(`Expected value <= ${maxValue}, but received: ${value}`); + } + return value; +} + +export function readUint8(reader: Reader): number { + const { offset, data } = reader; + if (offset + 1 > data.byteLength) { + throw new Error(`Unexpected EOF`); + } + reader.offset += 1; + return data.getUint8(offset); +} + +export function readInt32le(reader: Reader): number { + const { offset, data } = reader; + if (offset + 4 > data.byteLength) { + throw new Error(`Unexpected EOF`); + } + reader.offset += 4; + return data.getInt32(offset, /*littleEndian=*/ true); +} + +export function readUint64le(reader: Reader): bigint { + const { offset, data } = reader; + if (offset + 8 > data.byteLength) { + throw new Error(`Unexpected EOF`); + } + reader.offset += 8; + return data.getBigUint64(offset, /*littleEndian=*/ true); +} + +export function ensureEof(reader: Reader) { + if (reader.offset !== reader.data.byteLength) { + throw new Error(`Expected EOF at byte ${reader.offset}`); + } +} + +export type ArrayReader = ( + reader: Reader, + count: number, + options: Options, +) => T[]; + +export function readArrayOf( + readElement: (reader: Reader, options: Options) => T, +): ArrayReader { + return (reader, count, options) => { + const values: T[] = []; + for (let i = 0; i < count; ++i) { + values[i] = readElement(reader, options); + } + return values; + }; +} + +type StructOfArrays = { + [Property in keyof T]: ArrayLike; +} & Record>; + +type StructOfArrayReaders = Record< + string, + ArrayReader +> & { + [Property in keyof T]: ArrayReader; +}; + +export function toArrayOfStructs( + count: number, + arrays: StructOfArrays, +): T[] { + const keys = Object.keys(arrays) as (keyof T)[]; + const structs: T[] = []; + for (let i = 0; i < count; ++i) { + const value = Object.fromEntries( + keys.map((key) => [key, arrays[key][i]]), + ) as T; + structs[i] = value; + } + return structs; +} + +export function readStructOfArrays( + members: StructOfArrayReaders, + validate?: (value: T, options: Options) => void, +): ArrayReader { + return (reader, count, options) => { + const arrays = Object.fromEntries( + Object.entries(members).map(([key, read]) => [ + key, + read(reader, count, options), + ]), + ) as StructOfArrays; + const structs = toArrayOfStructs(count, arrays); + if (validate !== undefined) { + for (let i = 0; i < count; ++i) { + validate?.(structs[i], options); + } + } + return structs; + }; +} diff --git a/src/kvstore/ocdbt/frontend.ts b/src/kvstore/ocdbt/frontend.ts new file mode 100644 index 0000000000..86ea0f3564 --- /dev/null +++ b/src/kvstore/ocdbt/frontend.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { KvStore } from "#src/kvstore/index.js"; +import { getOcdbtUrl } from "#src/kvstore/ocdbt/url.js"; +import type { VersionSpecifier } from "#src/kvstore/ocdbt/version_specifier.js"; +import { ProxyKvStore } from "#src/kvstore/proxy.js"; + +export class OcdbtKvStore extends ProxyKvStore implements KvStore { + constructor( + sharedKvStoreContext: SharedKvStoreContext, + public baseUrl: string, + public version: VersionSpecifier | undefined, + ) { + super(sharedKvStoreContext); + } + + getUrl(key: string) { + return getOcdbtUrl(this, key); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/ocdbt/index.rst b/src/kvstore/ocdbt/index.rst new file mode 100644 index 0000000000..da1e0de742 --- /dev/null +++ b/src/kvstore/ocdbt/index.rst @@ -0,0 +1,68 @@ +.. _ocdbt-kvstore: + +ocdbt: Optionally-Cooperative Distributed B+tree +================================================ + +The OCDBT :ref:`key-value store adapter` provides access to an +:ref:`OCDBT database`. + +URL syntax +---------- + +- :file:`{base-kvstore-url/}|ocdbt:{path}/{to}/{entry}` +- :file:`{base-kvstore-url/}|ocdbt:@{TIMESTAMP}/{path}/{to}/{entry}` +- :file:`{base-kvstore-url/}|ocdbt:@v{N}/{path}/{to}/{entry}` + +The :file:`{base-kvstore-url/}` must refer to a directory. + +- The :file:`ocdbt:{path}/{to}/{entry}` syntax indicates the latest version. + +- The :file:`ocdbt:@{TIMESTAMP}/{path}/{to}/{entry}` syntax specifies a version by commit + timestamp. The timestamp must be in `ISO 8601 + `__ syntax + :file:`{YYYY}-{MM}-{DD}T{hh}:{mm}:{ss}Z` or + :file:`{YYYY}-{MM}-{DD}T{hh}:{mm}:{ss}.{sssssssss}Z`. + +- The :file:`ocdbt:@v{N}/{path}/{to}/{entry}` syntax specifies a version by + generation number. + +For example: + +- ``gs://bucket/path/to/repo.zarr.ocdbt/|ocdbt:path/to/array/`` +- ``gs://bucket/path/to/repo.zarr.ocdbt/|ocdbt:@2024-12-31T10:23:45.123456789Z/path/to/array/`` +- ``gs://bucket/path/to/repo.zarr.ocdbt/|ocdbt:@v10/path/to/array/`` + +.. note:: + + Consistent with normal URL syntax, any special characters in the + :file:`{path}/{to}/{entry}`, including ``@`` which is used to specify a + version, must be `percent-encoded + `__. + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported. + * - :ref:`kvstore-listing` + - Supported. + +.. list-table:: Required capabilities of base key-value store + + * - :ref:`kvstore-byte-range-reads` + - Required. + * - :ref:`kvstore-listing` + - Not needed. + +Auto detection +-------------- + +Directories containing OCDBT databases are detected automatically based on the +presence of the :file:`manifest.ocdbt` file. + +Limitations +----------- + +- Entries without a valid Unicode path are ignored. diff --git a/src/kvstore/ocdbt/indirect_data_reference.ts b/src/kvstore/ocdbt/indirect_data_reference.ts new file mode 100644 index 0000000000..db50618d95 --- /dev/null +++ b/src/kvstore/ocdbt/indirect_data_reference.ts @@ -0,0 +1,192 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Reader } from "#src/kvstore/ocdbt/decode_utils.js"; +import { + readArrayOf, + readBytes, + readLeb128, + readLeb128Bigint, + readLeb128Bounded, + readStructOfArrays, +} from "#src/kvstore/ocdbt/decode_utils.js"; +import { EMPTY_KEY } from "#src/kvstore/ocdbt/key.js"; +import { pipelineUrlJoin } from "#src/kvstore/url.js"; + +export interface IndirectDataReference { + dataFile: DataFileId; + offset: bigint; + length: bigint; +} + +export interface ReadIndirectDataReferenceOptions { + allowMissing?: boolean; + dataFileTable: DataFileTable; +} + +export function readDataFileId( + reader: Reader, + options: { dataFileTable: DataFileTable }, +) { + const { dataFileTable } = options; + const index = readLeb128(reader); + if (index >= dataFileTable.length) { + throw new Error( + `Invalid data file index ${index}, expected value <= ${dataFileTable.length}`, + ); + } + return dataFileTable[index]; +} + +export const readIndirectDataReferences = readStructOfArrays< + IndirectDataReference, + ReadIndirectDataReferenceOptions +>( + { + dataFile: readArrayOf(readDataFileId), + offset: readArrayOf(readLeb128Bigint), + length: readArrayOf(readLeb128Bigint), + }, + (value, options) => { + if (locationIsMissing(value)) { + if (options.allowMissing !== true) { + throw new Error(`Reference to missing value not allowed`); + } + } else { + if (value.offset + value.length > BigInt(Number.MAX_SAFE_INTEGER)) { + throw new Error( + `Offset=${value.offset} + length=${value.length} exceeds maximum of ${Number.MAX_SAFE_INTEGER}`, + ); + } + } + }, +); + +export function locationIsMissing(location: IndirectDataReference): boolean { + return ( + location.offset === 0xffffffffffffffffn && + location.length === 0xffffffffffffffffn + ); +} + +const MAX_PATH_LENGTH = 0xffff; + +export interface DataFileId { + baseUrl: string; + relativePath: string; +} + +export type DataFileTable = DataFileId[]; + +export function readDataFileTable( + reader: Reader, + transitiveBaseUrl: string, +): DataFileTable { + const numFiles = readLeb128(reader); + const pathLengthBuffer = new Uint16Array(numFiles * 3); + for (let i = 1, count = numFiles * 3; i < count; ++i) { + pathLengthBuffer[i] = readLeb128Bounded(reader, MAX_PATH_LENGTH); + } + const dataFileIds: DataFileId[] = []; + let prevBasePath = EMPTY_KEY; + let prevRelativePathEncoded = EMPTY_KEY; + const textDecoder = new TextDecoder("utf-8", { fatal: true }); + for (let i = 0; i < numFiles; ++i) { + let prefixLength = pathLengthBuffer[i]; + let suffixLength = pathLengthBuffer[i + numFiles]; + const basePathLength = pathLengthBuffer[i + 2 * numFiles]; + const pathLength = prefixLength + suffixLength; + if (pathLength > MAX_PATH_LENGTH) { + throw new Error( + `path_length[${i} = prefix_length(${prefixLength}) + suffix_length(${suffixLength}) = ${pathLength} > ${MAX_PATH_LENGTH}`, + ); + } + if (basePathLength > pathLength) { + throw new Error( + `base_path_length[${i}] = ${basePathLength} > path_length(${pathLength}) = prefix_length(${prefixLength}) + suffix_length(${suffixLength})`, + ); + } + if ( + prefixLength > Math.min(prevBasePath.length, basePathLength) && + basePathLength !== prevBasePath.length + ) { + throw new Error( + `path_prefix_length[${i - 1}] = ${prefixLength} > min(base_path_length[${i - 1}] = ${prevBasePath.length}, base_path_length[${i}] = ${basePathLength}) is not valid if base_path_length[${i - 1}] != base_path_length[${i}]`, + ); + } + + const relativePathLength = prefixLength + suffixLength - basePathLength; + + let baseUrl: string; + let relativePath: string; + if (basePathLength === 0) { + baseUrl = transitiveBaseUrl; + prevBasePath = EMPTY_KEY; + } else if (prefixLength >= basePathLength) { + baseUrl = dataFileIds[i - 1].baseUrl; + // prevBasePath remains unchanged + } else { + const basePath = new Uint8Array(basePathLength); + let offset = 0; + const baseSuffixLength = Math.max(basePathLength - prefixLength, 0); + if (prefixLength > 0) { + const basePrefixLength = Math.min(prefixLength, basePathLength); + basePath.set(prevBasePath.subarray(0, basePrefixLength)); + offset = basePrefixLength; + prefixLength -= basePrefixLength; + } + if (baseSuffixLength !== 0) { + basePath.set(readBytes(reader, baseSuffixLength), offset); + suffixLength -= baseSuffixLength; + } + + baseUrl = pipelineUrlJoin( + transitiveBaseUrl, + textDecoder.decode(basePath), + ); + prevBasePath = basePath; + } + + if (relativePathLength === 0) { + relativePath = ""; + prevRelativePathEncoded = EMPTY_KEY; + } else if ( + suffixLength === 0 && + relativePathLength === prevRelativePathEncoded.length + ) { + relativePath = dataFileIds[i - 1].relativePath; + // prevRelativePathEncoded remains unchanged + } else { + const relativePathEncoded = new Uint8Array(relativePathLength); + let offset = 0; + if (prefixLength !== 0) { + relativePathEncoded.set( + prevRelativePathEncoded.subarray(0, prefixLength), + 0, + ); + offset += prefixLength; + } + if (suffixLength > 0) { + relativePathEncoded.set(readBytes(reader, suffixLength), offset); + } + relativePath = textDecoder.decode(relativePathEncoded); + prevRelativePathEncoded = relativePathEncoded; + } + dataFileIds[i] = { baseUrl, relativePath }; + } + + return dataFileIds; +} diff --git a/src/kvstore/ocdbt/key.ts b/src/kvstore/ocdbt/key.ts new file mode 100644 index 0000000000..e5c4540eb2 --- /dev/null +++ b/src/kvstore/ocdbt/key.ts @@ -0,0 +1,101 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const EMPTY_KEY = new Uint8Array(0); + +export type Key = Uint8Array; + +export function compareArraysLexicographically( + a: ArrayLike, + b: ArrayLike, +) { + const minLength = Math.min(a.length, b.length); + for (let i = 0; i < minLength; ++i) { + const d = a[i] - b[i]; + if (d !== 0) return d; + } + return a.length - b.length; +} + +export function findFirstMismatch(a: ArrayLike, b: ArrayLike) { + const minLength = Math.min(a.length, b.length); + for (let i = 0; i < minLength; ++i) { + const d = a[i] - b[i]; + if (d !== 0) return { offset: i, difference: d }; + } + return { offset: minLength, difference: a.length - b.length }; +} + +export interface KeyRange { + inclusiveMin: Key; + exclusiveMax: Key; +} + +const EMPTY_KEY_RANGE: KeyRange = { + inclusiveMin: EMPTY_KEY, + exclusiveMax: Uint8Array.of(0), +}; + +export function removeKeyRangePrefix( + keyRange: KeyRange, + prefix: Key, +): KeyRange { + if (prefix.length === 0) return keyRange; + let { inclusiveMin, exclusiveMax } = keyRange; + { + const { offset, difference } = findFirstMismatch(prefix, inclusiveMin); + if (difference >= 0) { + inclusiveMin = EMPTY_KEY; + } else if (offset < prefix.length) { + return EMPTY_KEY_RANGE; + } else { + inclusiveMin = inclusiveMin.subarray(prefix.length); + } + } + if (exclusiveMax.length !== 0) { + const { offset, difference } = findFirstMismatch(prefix, exclusiveMax); + if (difference >= 0) { + return EMPTY_KEY_RANGE; + } + if (offset < prefix.length) { + exclusiveMax = EMPTY_KEY; + } else { + exclusiveMax = exclusiveMax.subarray(prefix.length); + } + } + return { inclusiveMin, exclusiveMax }; +} + +export function concatKeys(...keys: Key[]): Key { + let length = 0; + for (const key of keys) { + length += key.length; + } + const newKey = new Uint8Array(length); + let offset = 0; + for (const key of keys) { + newKey.set(key, offset); + offset += key.length; + } + return newKey; +} + +export function keyStartsWith(key: Key, prefix: Key): boolean { + return ( + key.length >= prefix.length && + findFirstMismatch(key, prefix).offset === prefix.length + ); +} diff --git a/src/kvstore/ocdbt/list.ts b/src/kvstore/ocdbt/list.ts new file mode 100644 index 0000000000..9f75dbeaf5 --- /dev/null +++ b/src/kvstore/ocdbt/list.ts @@ -0,0 +1,232 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { + normalizeListResponse, + type ListEntry, + type ListResponse, +} from "#src/kvstore/index.js"; +import type { + BtreeInteriorNodeEntry, + BtreeLeafNodeEntry, + BtreeNodeReference, +} from "#src/kvstore/ocdbt/btree.js"; +import { + findBtreeInteriorEntryPrefixRange, + findBtreeEntryPrefixUpperBound, + validateBtreeNodeReference, + findBtreeLeafEntryPrefixRange, +} from "#src/kvstore/ocdbt/btree.js"; +import { locationIsMissing } from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { Key } from "#src/kvstore/ocdbt/key.js"; +import { + concatKeys, + EMPTY_KEY, + findFirstMismatch, +} from "#src/kvstore/ocdbt/key.js"; +import { getBtreeNode } from "#src/kvstore/ocdbt/metadata_cache.js"; +import type { BtreeGenerationReference } from "#src/kvstore/ocdbt/version_tree.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const DEBUG = false; + +export async function listRoot( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + root: BtreeGenerationReference, + prefix: Key, + options: Partial, +): Promise { + const entries: ListEntry[] = []; + const directories = new Set(); + if (!locationIsMissing(root.root.location)) { + await listSubtree(root.root, root.rootHeight, EMPTY_KEY, 0, { + sharedKvStoreContext, + prefix, + entries: entries, + directories, + signal: options.signal, + progressListener: options.progressListener, + }); + } + const response = normalizeListResponse({ + entries, + directories: Array.from(directories), + }); + if (DEBUG) { + console.log(JSON.stringify(response)); + } + return response; +} + +interface ListSubtreeOptions extends Partial { + sharedKvStoreContext: SharedKvStoreContextCounterpart; + prefix: Key; + directories: Set; + entries: ListEntry[]; +} + +async function listSubtree( + nodeReference: BtreeNodeReference, + height: number, + inclusiveMinKey: Uint8Array, + subtreeCommonPrefixLength: number, + options: ListSubtreeOptions, +): Promise { + options.signal?.throwIfAborted(); + const node = await getBtreeNode( + options.sharedKvStoreContext, + nodeReference.location, + options, + ); + validateBtreeNodeReference( + node, + height, + inclusiveMinKey.subarray(subtreeCommonPrefixLength), + ); + const subtreeKeyPrefix = concatKeys( + inclusiveMinKey.subarray(0, subtreeCommonPrefixLength), + node.keyPrefix, + ); + if (DEBUG) { + console.log("listSubtree", { + nodeReference, + height, + inclusiveMinKey, + subtreeCommonPrefixLength, + }); + } + const addDirectoryIfValid = (key: Key) => { + try { + options.directories.add( + new TextDecoder("utf-8", { fatal: true }).decode(key), + ); + } catch { + // Skip invalid utf-8 keys. + } + }; + const { prefix } = options; + { + const { offset, difference } = findFirstMismatch(prefix, subtreeKeyPrefix); + if ( + difference !== 0 && + offset < Math.min(prefix.length, subtreeKeyPrefix.length) + ) { + // No keys in node match prefix. + return; + } + } + + if (prefix.length < subtreeKeyPrefix.length) { + // Check if there is a directory separator in `subtreeKeyPrefix` after `prefix`. + const separatorIndex = subtreeKeyPrefix.indexOf(0x2f, prefix.length); + if (separatorIndex !== -1) { + // All keys in the node are part of a common directory. + addDirectoryIfValid(subtreeKeyPrefix.subarray(0, separatorIndex)); + return; + } + } + + const prefixForCurrentNode = prefix.subarray(subtreeKeyPrefix.length); + if (node.height > 0) { + const entries = node.entries as BtreeInteriorNodeEntry[]; + const [lower, upper] = findBtreeInteriorEntryPrefixRange( + entries, + prefixForCurrentNode, + ); + if (DEBUG) { + console.log( + "Got entry range", + lower, + upper, + entries.length, + prefixForCurrentNode, + ); + } + const promises: Promise[] = []; + for (let entryIndex = lower; entryIndex < upper; ) { + const entry = entries[entryIndex]; + ++entryIndex; + const { key } = entry; + const { subtreeCommonPrefixLength } = entry; + if (subtreeCommonPrefixLength > prefixForCurrentNode.length) { + const separatorIndex = key.indexOf( + 0x2f /* "/".charCodeAt(0) */, + prefixForCurrentNode.length, + ); + if (separatorIndex !== -1) { + // Since there is an additional directory separator after `prefix` + // within the common key prefix for the subtree, it is not necessary + // to traverse down into the child. + const directoryPrefix = key.subarray(0, separatorIndex); + addDirectoryIfValid(concatKeys(subtreeKeyPrefix, directoryPrefix)); + entryIndex = findBtreeEntryPrefixUpperBound( + entries, + entryIndex, + upper, + directoryPrefix, + ); + continue; + } + } + promises.push( + listSubtree( + entry.node, + height - 1, + concatKeys(subtreeKeyPrefix, entry.key), + subtreeKeyPrefix.length + entry.subtreeCommonPrefixLength, + options, + ), + ); + } + await Promise.all(promises); + } else { + const entries = node.entries as BtreeLeafNodeEntry[]; + const [lower, upper] = findBtreeLeafEntryPrefixRange( + entries, + prefixForCurrentNode, + ); + for (let entryIndex = lower; entryIndex < upper; ) { + const entry = entries[entryIndex]; + ++entryIndex; + const { key } = entry; + const separatorIndex = key.indexOf( + 0x2f /* "/".charCodeAt(0) */, + prefixForCurrentNode.length, + ); + if (separatorIndex !== -1) { + const directoryPrefix = key.subarray(0, separatorIndex); + addDirectoryIfValid(concatKeys(subtreeKeyPrefix, directoryPrefix)); + entryIndex = findBtreeEntryPrefixUpperBound( + entries, + entryIndex, + upper, + key.subarray(0, separatorIndex + 1), + ); + continue; + } + try { + options.entries.push({ + key: new TextDecoder("utf-8", { fatal: true }).decode( + concatKeys(subtreeKeyPrefix, key), + ), + }); + } catch { + // Ignore invalid utf-8 keys. + } + } + } +} diff --git a/src/kvstore/ocdbt/list_versions.ts b/src/kvstore/ocdbt/list_versions.ts new file mode 100644 index 0000000000..2faf417986 --- /dev/null +++ b/src/kvstore/ocdbt/list_versions.ts @@ -0,0 +1,167 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { ManifestWithVersionTree } from "#src/kvstore/ocdbt/manifest.js"; +import { getVersionTreeNode } from "#src/kvstore/ocdbt/metadata_cache.js"; +import type { + BtreeGenerationReference, + GenerationIndex, + VersionNodeReference, + VersionQuery, +} from "#src/kvstore/ocdbt/version_tree.js"; +import { + bigintCompare, + findLeafVersionIndexByLowerBound, + findVersionNodeIndexByLowerBound, + findVersionNodeIndexByUpperBound, + validateVersionTreeNodeReference, +} from "#src/kvstore/ocdbt/version_tree.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const DEBUG = false; + +export interface ListVersionsOptions extends Partial { + inclusiveMin?: VersionQuery; + exclusiveMax?: VersionQuery; +} + +export async function listVersions( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + options: ListVersionsOptions, +): Promise<{ + generationIndex: GenerationIndex; + versions: BtreeGenerationReference[]; +}> { + const { inclusiveMin, exclusiveMax } = options; + if (DEBUG) { + console.log("listVersions", inclusiveMin, exclusiveMax); + } + const resolvedInclusiveMin: VersionQuery = + inclusiveMin === undefined ? { generationIndex: 0n } : inclusiveMin; + const resolvedExclusiveMax: VersionQuery = + exclusiveMax === undefined + ? { generationIndex: manifest.versionTree.numGenerations } + : exclusiveMax; + const { config, versionTree } = manifest; + const { versionTreeArityLog2 } = config; + let minGenerationIndex: GenerationIndex | undefined; + const results: BtreeGenerationReference[] = []; + { + const generationIndex = + versionTree.versionTreeNodes.at(-1)?.cumulativeNumGenerations ?? 0n; + visitLeafEntries(generationIndex, versionTree.inlineVersions); + await visitInteriorEntries(0n, versionTree.versionTreeNodes); + } + + function visitLeafEntries( + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + ) { + const lower = findLeafVersionIndexByLowerBound( + generationIndex, + versions, + resolvedInclusiveMin, + ); + const upper = findLeafVersionIndexByLowerBound( + generationIndex, + versions, + resolvedExclusiveMax, + ); + const resultGenerationIndex = generationIndex + BigInt(lower); + if ( + minGenerationIndex === undefined || + resultGenerationIndex < minGenerationIndex + ) { + minGenerationIndex = resultGenerationIndex; + } + for (let i = lower; i < upper; ++i) { + results.push(versions[i]); + } + } + + async function visitInteriorEntries( + generationIndex: GenerationIndex, + versionNodes: VersionNodeReference[], + ): Promise { + options.signal?.throwIfAborted(); + const lower = findVersionNodeIndexByLowerBound( + versionTreeArityLog2, + generationIndex, + versionNodes, + resolvedInclusiveMin, + ); + const upper = findVersionNodeIndexByUpperBound( + generationIndex, + versionNodes, + resolvedExclusiveMax, + ); + if (DEBUG) { + console.log( + "listVersions: visitInteriorEntries", + resolvedInclusiveMin, + resolvedExclusiveMax, + `generationIndex=${generationIndex}`, + `versionNodes.length=${versionNodes.length}`, + lower, + upper, + ); + } + const promises: Promise[] = []; + for (let i = lower; i < upper; ++i) { + const ref = versionNodes[i]; + promises.push( + visitNodeRef( + generationIndex + ref.cumulativeNumGenerations - ref.numGenerations, + ref, + ), + ); + } + await Promise.all(promises); + } + + async function visitNodeRef( + generationIndex: GenerationIndex, + ref: VersionNodeReference, + ): Promise { + const node = await getVersionTreeNode( + sharedKvStoreContext, + ref.location, + options, + ); + validateVersionTreeNodeReference( + node, + config, + ref.generationNumber, + ref.height, + ref.numGenerations, + ); + if (node.height === 0) { + visitLeafEntries( + generationIndex, + node.entries as BtreeGenerationReference[], + ); + } else { + await visitInteriorEntries( + generationIndex, + node.entries as VersionNodeReference[], + ); + } + } + results.sort((a, b) => bigintCompare(a.generationNumber, b.generationNumber)); + return { generationIndex: minGenerationIndex ?? 0n, versions: results }; +} diff --git a/src/kvstore/ocdbt/manifest.ts b/src/kvstore/ocdbt/manifest.ts new file mode 100644 index 0000000000..61af09e334 --- /dev/null +++ b/src/kvstore/ocdbt/manifest.ts @@ -0,0 +1,275 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Reader } from "#src/kvstore/ocdbt/decode_utils.js"; +import { + CompressionMethod, + decodeEnvelope, + readBytes, + readInt32le, + readLeb128, + ensureEof, +} from "#src/kvstore/ocdbt/decode_utils.js"; +import type { DataFileTable } from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import { readDataFileTable } from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { + BtreeGenerationReference, + GenerationIndex, + GenerationNumber, + VersionNodeReference, + VersionTreeArityLog2, +} from "#src/kvstore/ocdbt/version_tree.js"; +import { + getMaxVersionTreeHeight, + readVersionTreeArityLog2, + readVersionTreeInteriorNodeEntries, + readVersionTreeLeafNode, +} from "#src/kvstore/ocdbt/version_tree.js"; + +export interface ManifestVersionTree { + inlineVersions: BtreeGenerationReference[]; + versionTreeNodes: VersionNodeReference[]; + numGenerations: GenerationIndex; +} + +export enum ManifestKind { + single = 0, + numbered = 1, +} + +export interface Config { + uuid: Uint8Array; + manifestKind: ManifestKind; + maxInlineValueBytes: number; + maxDecodedNodeBytes: number; + versionTreeArityLog2: VersionTreeArityLog2; + compressionMethod: CompressionMethod; + zstdLevel?: number; +} + +export interface Manifest { + config: Config; + versionTree?: ManifestVersionTree; + estimatedSize: number; +} + +export interface ManifestWithVersionTree extends Manifest { + versionTree: ManifestVersionTree; +} + +function decodeConfig(reader: Reader): Config { + const uuid = readBytes(reader, 16).slice(); + const manifestKind = readLeb128(reader); + if (manifestKind > 1) { + throw new Error(`Unknown manifest kind: ${manifestKind}`); + } + const maxInlineValueBytes = readLeb128(reader); + const maxDecodedNodeBytes = readLeb128(reader); + const versionTreeArityLog2 = readVersionTreeArityLog2(reader); + const compressionMethod = readLeb128(reader); + let zstdLevel: number | undefined; + switch (compressionMethod) { + case CompressionMethod.UNCOMPRESSED: + break; + case CompressionMethod.ZSTD: + zstdLevel = readInt32le(reader); + break; + default: + throw new Error(`Invalid compression method: ${compressionMethod}`); + } + return { + uuid, + manifestKind, + maxInlineValueBytes, + maxDecodedNodeBytes, + versionTreeArityLog2, + compressionMethod, + zstdLevel, + }; +} + +function decodeManifestVersionTree( + reader: Reader, + config: Config, + baseUrl: string, +): ManifestVersionTree { + const dataFileTable = readDataFileTable(reader, baseUrl); + + const inlineVersions = readVersionTreeLeafNode( + reader, + config.versionTreeArityLog2, + dataFileTable, + ); + + const versionTreeNodes = readManifestVersionTreeNodes( + reader, + config.versionTreeArityLog2, + dataFileTable, + inlineVersions.at(-1)!.generationNumber, + ); + return { + inlineVersions, + versionTreeNodes, + numGenerations: + BigInt(inlineVersions.length) + + (versionTreeNodes.at(-1)?.cumulativeNumGenerations ?? 0n), + }; +} + +function readManifestVersionTreeNodes( + reader: Reader, + versionTreeArityLog2: number, + dataFileTable: DataFileTable, + lastGenerationNumber: GenerationNumber, +): VersionNodeReference[] { + const maxNumEntries = getMaxVersionTreeHeight(versionTreeArityLog2); + const entries = readVersionTreeInteriorNodeEntries( + reader, + dataFileTable, + maxNumEntries, + /* height=*/ undefined, + ); + validateManifestVersionTreeNodes( + versionTreeArityLog2, + lastGenerationNumber, + entries, + ); + return entries; +} + +function validateManifestVersionTreeNodes( + versionTreeArityLog2: number, + lastGenerationNumber: GenerationNumber, + entries: VersionNodeReference[], +): void { + const maxHeight = getMaxVersionTreeHeight(versionTreeArityLog2); + for (const [i, entry] of entries.entries()) { + if (entry.height === 0 || entry.height > maxHeight) { + throw new Error( + `entry_height[${i}]=${entry.height} outside valid range [1, ${maxHeight}]`, + ); + } + if (entry.generationNumber === 0n) { + throw new Error(`generation_number[${i}] must be non-zero`); + } + if (i > 0) { + const prev = entries[i - 1]; + if (entry.generationNumber <= prev.generationNumber) { + throw new Error( + `generation_number[${i}]=${entry.generationNumber} <= generation_number[${i - 1}]=${prev.generationNumber}`, + ); + } + if (entry.height >= prev.height) { + throw new Error( + `entry_height[${i}]=${entry.height} >= entry_height[${i - 1}]=${prev.height}`, + ); + } + } + } + let i = entries.length; + for (const { + minGenerationNumber, + maxGenerationNumber, + height, + } of getPossibleManifestVersionTreeNodeReferences( + lastGenerationNumber, + versionTreeArityLog2, + )) { + if (i === 0) { + // Height not present. + break; + } + const entry = entries[i - 1]; + if (entry.height !== height) { + // Height not present + continue; + } + --i; + const { generationNumber } = entry; + if ( + generationNumber < minGenerationNumber || + generationNumber > maxGenerationNumber + ) { + throw new Error( + `generation_number[${i}]=${generationNumber} is outside expected range [${minGenerationNumber}, ${maxGenerationNumber}] for height ${height}`, + ); + } + } + + if (i !== 0) { + throw new Error( + `Unexpected child with generation_number[${i - 1}]=${entries[i - 1].generationNumber} and entry_height=${entries[i - 1].height} given last generation_number=${lastGenerationNumber}`, + ); + } +} + +interface PossibleManifestVersionTreeNodeReferences { + minGenerationNumber: GenerationNumber; + maxGenerationNumber: GenerationNumber; + height: number; +} + +function getPossibleManifestVersionTreeNodeReferences( + generationNumber: GenerationNumber, + versionTreeArityLog2: number, +): PossibleManifestVersionTreeNodeReferences[] { + generationNumber = + ((generationNumber - 1n) >> BigInt(versionTreeArityLog2)) << + BigInt(versionTreeArityLog2); + let height = 1; + const results: PossibleManifestVersionTreeNodeReferences[] = []; + while (generationNumber !== 0n) { + const shift = BigInt((height + 1) * versionTreeArityLog2); + const nextGenerationNumber = ((generationNumber - 1n) >> shift) << shift; + const minGenerationNumber = nextGenerationNumber + 1n; + results.push({ + minGenerationNumber, + maxGenerationNumber: generationNumber, + height, + }); + ++height; + generationNumber = nextGenerationNumber; + } + return results; +} + +const MANIFEST_MAGIC_VALUE = 0x0cdb3a2a; +const MANIFEST_FORMAT_VERSION = 0; + +export async function decodeManifest( + buffer: ArrayBuffer, + baseUrl: string, + signal: AbortSignal, +): Promise { + try { + const { reader } = await decodeEnvelope( + buffer, + MANIFEST_MAGIC_VALUE, + MANIFEST_FORMAT_VERSION, + signal, + ); + + const config = decodeConfig(reader); + const versionTree = + config.manifestKind === ManifestKind.single + ? decodeManifestVersionTree(reader, config, baseUrl) + : undefined; + ensureEof(reader); + return { config, versionTree, estimatedSize: reader.data.byteLength * 3 }; + } catch (e) { + throw new Error(`Error decoding OCDBT manifest`, { cause: e }); + } +} diff --git a/src/kvstore/ocdbt/metadata_cache.ts b/src/kvstore/ocdbt/metadata_cache.ts new file mode 100644 index 0000000000..361c048630 --- /dev/null +++ b/src/kvstore/ocdbt/metadata_cache.ts @@ -0,0 +1,191 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { BtreeNode } from "#src/kvstore/ocdbt/btree.js"; +import { decodeBtreeNode } from "#src/kvstore/ocdbt/btree.js"; +import type { + DataFileId, + IndirectDataReference, +} from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { + Manifest, + ManifestWithVersionTree, +} from "#src/kvstore/ocdbt/manifest.js"; +import { decodeManifest } from "#src/kvstore/ocdbt/manifest.js"; +import type { VersionTreeNode } from "#src/kvstore/ocdbt/version_tree.js"; +import { decodeVersionTreeNode } from "#src/kvstore/ocdbt/version_tree.js"; +import { pipelineUrlJoin } from "#src/kvstore/url.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export function getManifest( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + dataFile: DataFileId, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "ocdbt:manifest", + () => { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async ( + dataFile: DataFileId, + progressOptions: ProgressOptions, + ) => { + const fullUrl = pipelineUrlJoin( + dataFile.baseUrl, + dataFile.relativePath, + ); + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading OCDBT manifest from ${fullUrl}`, + }); + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + fullUrl, + { + ...progressOptions, + throwIfMissing: true, + }, + ); + try { + const manifest = await decodeManifest( + await readResponse.response.arrayBuffer(), + dataFile.baseUrl, + progressOptions.signal, + ); + return { data: manifest, size: manifest.estimatedSize }; + } catch (e) { + throw new Error(`Error reading OCDBT manifest from ${fullUrl}`, { + cause: e, + }); + } + }, + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get(dataFile, options); +} + +export async function getResolvedManifest( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + options: Partial, +): Promise { + const manifest = await getManifest( + sharedKvStoreContext, + { baseUrl: url, relativePath: "manifest.ocdbt" }, + options, + ); + if (manifest.versionTree === undefined) { + throw new Error("only manifest_kind=single is supported"); + } + return manifest as ManifestWithVersionTree; +} + +function makeIndirectDataReferenceCache( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + description: string, + decode: ( + data: ArrayBuffer, + baseUrl: string, + signal: AbortSignal, + ) => Promise, +) { + const cache = new SimpleAsyncCache( + sharedKvStoreContext.chunkManager.addRef(), + { + get: async ( + location: IndirectDataReference, + progressOptions: ProgressOptions, + ) => { + const { dataFile } = location; + const fullUrl = pipelineUrlJoin( + dataFile.baseUrl, + dataFile.relativePath, + ); + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + fullUrl, + { + ...progressOptions, + throwIfMissing: true, + byteRange: { + offset: Number(location.offset), + length: Number(location.length), + }, + }, + ); + try { + const node = await decode( + await readResponse.response.arrayBuffer(), + dataFile.baseUrl, + progressOptions.signal, + ); + return { data: node, size: node.estimatedSize }; + } catch (e) { + throw new Error( + `Error reading OCDBT ${description} from ${fullUrl}`, + { + cause: e, + }, + ); + } + }, + encodeKey: ({ dataFile, offset, length }) => + JSON.stringify([dataFile, `${offset}/${length}`]), + }, + ); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; +} + +export function getBtreeNode( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + location: IndirectDataReference, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "ocdbt:btree", + () => + makeIndirectDataReferenceCache( + sharedKvStoreContext, + "b+tree node", + decodeBtreeNode, + ), + ); + return cache.get(location, options); +} + +export function getVersionTreeNode( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + location: IndirectDataReference, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "ocdbt:versionnode", + () => + makeIndirectDataReferenceCache( + sharedKvStoreContext, + "version tree node", + decodeVersionTreeNode, + ), + ); + return cache.get(location, options); +} diff --git a/src/kvstore/ocdbt/read.ts b/src/kvstore/ocdbt/read.ts new file mode 100644 index 0000000000..8c9afcf994 --- /dev/null +++ b/src/kvstore/ocdbt/read.ts @@ -0,0 +1,154 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { + FileByteRangeHandle, + handleByteRangeRequestFromUint8Array, +} from "#src/kvstore/byte_range/file_handle.js"; +import type { DriverReadOptions, ReadResponse } from "#src/kvstore/index.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import type { + BtreeInteriorNodeEntry, + BtreeLeafNodeEntry, + BtreeNodeHeight, + BtreeNodeReference, +} from "#src/kvstore/ocdbt/btree.js"; +import { + findBtreeInteriorEntry, + findBtreeLeafEntry, + validateBtreeNodeReference, +} from "#src/kvstore/ocdbt/btree.js"; +import { locationIsMissing } from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { Key } from "#src/kvstore/ocdbt/key.js"; +import { EMPTY_KEY, keyStartsWith } from "#src/kvstore/ocdbt/key.js"; +import { getBtreeNode } from "#src/kvstore/ocdbt/metadata_cache.js"; +import type { BtreeGenerationReference } from "#src/kvstore/ocdbt/version_tree.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const DEBUG = false; + +export async function findEntryInRoot( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + root: BtreeGenerationReference, + key: Key, + options: Partial, +): Promise { + if (locationIsMissing(root.root.location)) { + return undefined; + } + return await findEntryInSubtree( + sharedKvStoreContext, + root.root, + root.rootHeight, + EMPTY_KEY, + key, + options, + ); +} + +export async function readFromRoot( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + root: BtreeGenerationReference, + key: Key, + options: DriverReadOptions, +): Promise { + if (locationIsMissing(root.root.location)) { + return undefined; + } + const entry = await findEntryInSubtree( + sharedKvStoreContext, + root.root, + root.rootHeight, + EMPTY_KEY, + key, + options, + ); + if (entry === undefined) return undefined; + return await readFromLeafNodeEntry(sharedKvStoreContext, entry, options); +} + +export async function findEntryInSubtree( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + nodeReference: BtreeNodeReference, + nodeHeight: BtreeNodeHeight, + inclusiveMinKey: Key, + queryKey: Key, + options: Partial, +): Promise { + while (true) { + const node = await getBtreeNode( + sharedKvStoreContext, + nodeReference.location, + options, + ); + if (DEBUG) { + console.log(nodeReference, nodeHeight, node, inclusiveMinKey, queryKey); + } + validateBtreeNodeReference(node, nodeHeight, inclusiveMinKey); + if (!keyStartsWith(queryKey, node.keyPrefix)) { + if (DEBUG) { + console.log( + "not found due to key prefix mismatch", + queryKey, + node.keyPrefix, + ); + } + return undefined; + } + if (node.height === 0) { + const entry = findBtreeLeafEntry( + node.entries as BtreeLeafNodeEntry[], + queryKey, + ); + return entry; + } + const entry = findBtreeInteriorEntry( + node.entries as BtreeInteriorNodeEntry[], + queryKey, + ); + if (entry === undefined) { + return undefined; + } + const { subtreeCommonPrefixLength } = entry; + queryKey = queryKey.subarray(subtreeCommonPrefixLength); + nodeReference = entry.node; + inclusiveMinKey = entry.key.subarray(subtreeCommonPrefixLength); + --nodeHeight; + } +} + +export async function readFromLeafNodeEntry( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + entry: BtreeLeafNodeEntry, + options: DriverReadOptions, +): Promise { + const { value } = entry; + if (value instanceof Uint8Array) { + return handleByteRangeRequestFromUint8Array(value, options.byteRange); + } + const { + offset, + length, + dataFile: { baseUrl, relativePath }, + } = value; + const { store, path } = + sharedKvStoreContext.kvStoreContext.getKvStore(baseUrl); + return await new FileByteRangeHandle( + new KvStoreFileHandle(store, path + relativePath), + { offset: Number(offset), length: Number(length) }, + ).read(options); +} diff --git a/src/kvstore/ocdbt/read_version.ts b/src/kvstore/ocdbt/read_version.ts new file mode 100644 index 0000000000..3d3f466c2d --- /dev/null +++ b/src/kvstore/ocdbt/read_version.ts @@ -0,0 +1,330 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { SimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { + Config, + ManifestWithVersionTree, +} from "#src/kvstore/ocdbt/manifest.js"; +import { + getResolvedManifest, + getVersionTreeNode, +} from "#src/kvstore/ocdbt/metadata_cache.js"; +import type { VersionSpecifier } from "#src/kvstore/ocdbt/version_specifier.js"; +import { formatVersion } from "#src/kvstore/ocdbt/version_specifier.js"; +import type { + VersionNodeReference, + BtreeGenerationReference, + GenerationIndex, + VersionQuery, +} from "#src/kvstore/ocdbt/version_tree.js"; +import { + compareVersionSpecToVersion, + findLeafVersion, + findLeafVersionIndexByLowerBound, + findVersionNode, + findVersionNodeIndexByLowerBound, + findVersionNodeIndexByUpperBound, + validateVersionTreeNodeReference, +} from "#src/kvstore/ocdbt/version_tree.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export async function getRoot( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + url: string, + version: VersionSpecifier | undefined, + options: Partial, +): Promise { + const cache = sharedKvStoreContext.chunkManager.memoize.get( + "ocdbt:version", + () => { + const cache = new SimpleAsyncCache< + { url: string; version: VersionSpecifier | undefined }, + BtreeGenerationReference + >(sharedKvStoreContext.chunkManager.addRef(), { + get: async ({ url, version }, progressOptions) => { + const manifest = await getResolvedManifest( + sharedKvStoreContext, + url, + progressOptions, + ); + const root = await readVersion( + sharedKvStoreContext, + manifest, + version, + options, + ); + if (root === undefined) { + throw new Error(`Version ${formatVersion(version)} not found`); + } + return { + data: root.ref, + // BtreeGenerationReference is a tiny object, size may as well be 0 + size: 0, + }; + }, + encodeKey: ({ url, version }) => { + let versionString: string | undefined; + if (version !== undefined) { + versionString = formatVersion(version); + } + return JSON.stringify([url, versionString]); + }, + }); + cache.registerDisposer(sharedKvStoreContext.addRef()); + return cache; + }, + ); + return cache.get({ url, version }, options); +} + +export async function readVersion( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + version: VersionQuery | undefined, + options: Partial, +): Promise< + | { ref: BtreeGenerationReference; generationIndex: GenerationIndex } + | undefined +> { + const { versionTree } = manifest; + if (version === undefined) { + const { versionTreeNodes, inlineVersions } = versionTree; + const index = inlineVersions.length - 1; + return { + ref: inlineVersions[index], + generationIndex: + (versionTreeNodes.at(-1)?.cumulativeNumGenerations ?? 0n) + + BigInt(index), + }; + } + const { ref, generationIndex } = await findVersion( + sharedKvStoreContext, + manifest, + version, + options, + ); + if (ref === undefined) return undefined; + return { ref, generationIndex }; +} + +export async function findVersionIndexByLowerBound( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + version: VersionSpecifier, + options: Partial, +): Promise { + const { generationIndex } = await findVersionLowerBoundImpl( + sharedKvStoreContext, + manifest, + version, + options, + ); + return generationIndex; +} + +export async function findVersionIndexByUpperBound( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + version: VersionSpecifier, + options: Partial, +): Promise { + const { generationIndex } = await findVersionUpperBoundImpl( + sharedKvStoreContext, + manifest, + version, + options, + ); + return generationIndex; +} + +interface FindVersionImplOptions { + isInline( + config: Config, + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + query: Query, + ): boolean; + findInLeaf( + config: Config, + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + query: Query, + ): number; + findInInterior( + config: Config, + generationIndex: GenerationIndex, + versionNodes: VersionNodeReference[], + query: Query, + ): VersionNodeReference | undefined; +} + +function findVersionImpl(options: FindVersionImplOptions): ( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + query: Query, + options: Partial, +) => Promise<{ + ref: BtreeGenerationReference | undefined; + generationIndex: GenerationIndex; +}> { + const { isInline, findInLeaf, findInInterior } = options; + async function findVersion( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + manifest: ManifestWithVersionTree, + query: Query, + progressOptions: Partial, + ): Promise<{ + ref: BtreeGenerationReference | undefined; + generationIndex: GenerationIndex; + }> { + const { config, versionTree } = manifest; + const generationIndex = + versionTree.versionTreeNodes.at(-1)?.cumulativeNumGenerations ?? 0n; + const { inlineVersions } = versionTree; + if (isInline(config, generationIndex, inlineVersions, query)) { + const index = findInLeaf(config, generationIndex, inlineVersions, query); + return { + ref: inlineVersions[index], + generationIndex: generationIndex + BigInt(index), + }; + } + const { versionTreeNodes } = versionTree; + if (versionTreeNodes.length === 0) { + return { ref: undefined, generationIndex: 0n }; + } + const ref = findInInterior(config, 0n, versionTreeNodes, query); + if (ref === undefined) return { ref: undefined, generationIndex: 0n }; + return await findInSubtree( + sharedKvStoreContext, + manifest.config, + 0n + ref.cumulativeNumGenerations - ref.numGenerations, + ref, + query, + progressOptions, + ); + } + + async function findInSubtree( + sharedKvStoreContext: SharedKvStoreContextCounterpart, + config: Config, + generationIndex: GenerationIndex, + ref: VersionNodeReference, + query: Query, + progressOptions: Partial, + ): Promise<{ + ref: BtreeGenerationReference | undefined; + generationIndex: GenerationIndex; + }> { + while (true) { + const node = await getVersionTreeNode( + sharedKvStoreContext, + ref.location, + progressOptions, + ); + validateVersionTreeNodeReference( + node, + config, + ref.generationNumber, + ref.height, + ref.numGenerations, + ); + if (node.height === 0) { + const entries = node.entries as BtreeGenerationReference[]; + const index = findInLeaf(config, generationIndex, entries, query); + return { + ref: entries[index], + generationIndex: generationIndex + BigInt(index), + }; + } + const result = findInInterior( + config, + generationIndex, + node.entries as VersionNodeReference[], + query, + ); + if (result === undefined) return { ref: undefined, generationIndex }; + ref = result; + generationIndex += ref.cumulativeNumGenerations - ref.numGenerations; + } + } + + return findVersion; +} + +function isVersionQueryInline( + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + version: VersionQuery, +): boolean { + if ("generationIndex" in version) { + return version.generationIndex >= generationIndex; + } + return compareVersionSpecToVersion(version, versions[0]) >= 0; +} + +const findVersion = findVersionImpl({ + isInline(_config, generationIndex, versions, version) { + return isVersionQueryInline(generationIndex, versions, version); + }, + findInLeaf(_config, generationIndex, versions, version) { + return findLeafVersion(generationIndex, versions, version); + }, + findInInterior(config, generationIndex, versionNodes, version) { + return findVersionNode( + config.versionTreeArityLog2, + generationIndex, + versionNodes, + version, + ); + }, +}); + +const findVersionLowerBoundImpl = findVersionImpl({ + isInline(_config, generationIndex, versions, version) { + return isVersionQueryInline(generationIndex, versions, version); + }, + findInLeaf(_config, generationIndex, versions, version) { + return findLeafVersionIndexByLowerBound(generationIndex, versions, version); + }, + findInInterior(config, generationIndex, versionNodes, version) { + const index = findVersionNodeIndexByLowerBound( + config.versionTreeArityLog2, + generationIndex, + versionNodes, + version, + ); + return versionNodes[index]; + }, +}); + +const findVersionUpperBoundImpl = findVersionImpl({ + isInline(_config, generationIndex, versions, version) { + return isVersionQueryInline(generationIndex, versions, version); + }, + findInLeaf(_config, generationIndex, versions, version) { + return findLeafVersionIndexByLowerBound(generationIndex, versions, version); + }, + findInInterior(_config, generationIndex, versionNodes, version) { + const index = findVersionNodeIndexByUpperBound( + generationIndex, + versionNodes, + version, + ); + return versionNodes[index]; + }, +}); diff --git a/src/kvstore/ocdbt/register_backend.ts b/src/kvstore/ocdbt/register_backend.ts new file mode 100644 index 0000000000..b919765795 --- /dev/null +++ b/src/kvstore/ocdbt/register_backend.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { OcdbtKvStore } from "#src/kvstore/ocdbt/backend.js"; +import { completeOcdbtUrl } from "#src/kvstore/ocdbt/complete_url.js"; +import { parseOcdbtUrl } from "#src/kvstore/ocdbt/url.js"; + +function ocdbtProvider( + sharedKvStoreContext: SharedKvStoreContextCounterpart, +): KvStoreAdapterProvider { + return { + scheme: "ocdbt", + description: "OCDBT database", + getKvStore(parsedUrl, base) { + const { baseUrl, version, path } = parseOcdbtUrl(parsedUrl, base); + return { + store: new OcdbtKvStore(sharedKvStoreContext, baseUrl, version), + path, + }; + }, + + completeUrl(options) { + return completeOcdbtUrl(sharedKvStoreContext, options); + }, + }; +} + +backendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider( + ocdbtProvider, +); diff --git a/src/kvstore/ocdbt/register_frontend.ts b/src/kvstore/ocdbt/register_frontend.ts new file mode 100644 index 0000000000..f140308f38 --- /dev/null +++ b/src/kvstore/ocdbt/register_frontend.ts @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + KvStoreAdapterProvider, + CompletionResult, + KvStoreAdapterCompleteUrlOptions, +} from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { registerAutoDetect } from "#src/kvstore/ocdbt/auto_detect.js"; +import { OcdbtKvStore } from "#src/kvstore/ocdbt/frontend.js"; +import { parseOcdbtUrl } from "#src/kvstore/ocdbt/url.js"; +import { proxyCompleteUrl } from "#src/kvstore/proxy.js"; + +function ocdbtProvider( + sharedKvStoreContext: SharedKvStoreContext, +): KvStoreAdapterProvider { + return { + scheme: "ocdbt", + description: "OCDBT database", + getKvStore(parsedUrl, base) { + const { baseUrl, version, path } = parseOcdbtUrl(parsedUrl, base); + return { + store: new OcdbtKvStore(sharedKvStoreContext, baseUrl, version), + path, + }; + }, + completeUrl( + options: KvStoreAdapterCompleteUrlOptions, + ): Promise { + const { base, url } = options; + return proxyCompleteUrl( + sharedKvStoreContext, + `${base.store.getUrl(base.path)}|${url.url}`, + options, + ); + }, + }; +} + +frontendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider( + ocdbtProvider, +); + +registerAutoDetect(frontendOnlyKvStoreProviderRegistry.autoDetectRegistry); diff --git a/src/kvstore/ocdbt/url.ts b/src/kvstore/ocdbt/url.ts new file mode 100644 index 0000000000..019b104b6b --- /dev/null +++ b/src/kvstore/ocdbt/url.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreWithPath } from "#src/kvstore/index.js"; +import type { VersionSpecifier } from "#src/kvstore/ocdbt/version_specifier.js"; +import { + formatVersion, + parseVersion, +} from "#src/kvstore/ocdbt/version_specifier.js"; +import type { UrlWithParsedScheme } from "#src/kvstore/url.js"; +import { + encodePathForUrl, + ensureNoQueryOrFragmentParameters, + ensurePathIsDirectory, +} from "#src/kvstore/url.js"; + +export function getOcdbtUrl( + options: { baseUrl: string; version: VersionSpecifier | undefined }, + key: string, +): string { + const { version, baseUrl } = options; + const versionString = + version === undefined ? "" : `@${formatVersion(version)}/`; + return baseUrl + `|ocdbt:${versionString}${encodePathForUrl(key)}`; +} + +export function parseOcdbtUrl( + parsedUrl: UrlWithParsedScheme, + base: KvStoreWithPath, +) { + ensureNoQueryOrFragmentParameters(parsedUrl); + try { + const m = (parsedUrl.suffix ?? "").match(/^(?:@([^/]*)(?:\/|$))?(.*)$/)!; + const [, versionString, path] = m; + return { + baseUrl: base.store.getUrl(ensurePathIsDirectory(base.path)), + version: parseVersion(versionString), + path: decodeURIComponent(path), + }; + } catch (e) { + throw new Error(`Invalid URL: ${parsedUrl.url}`, { cause: e }); + } +} diff --git a/src/kvstore/ocdbt/version_specifier.ts b/src/kvstore/ocdbt/version_specifier.ts new file mode 100644 index 0000000000..d8ebcc50d9 --- /dev/null +++ b/src/kvstore/ocdbt/version_specifier.ts @@ -0,0 +1,188 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + CommitTime, + GenerationNumber, +} from "#src/kvstore/ocdbt/version_tree.js"; + +export type VersionSpecifier = + | { generationNumber: GenerationNumber } + | { commitTime: CommitTime }; + +export function formatVersion(version: VersionSpecifier | undefined) { + if (version === undefined) return "HEAD"; + if ("generationNumber" in version) { + return `v${version.generationNumber}`; + } + const { commitTime } = version; + return formatCommitTime(commitTime); +} + +export function parseVersion( + versionString: string | undefined, +): VersionSpecifier | undefined { + if (versionString === undefined) return undefined; + const m = versionString.match( + /^(?:v([1-9]\d*)|(?:\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d*)?Z))$/, + ); + if (m === null) { + throw new Error( + `Invalid OCDBT version specifier: ${JSON.stringify(versionString)}`, + ); + } + const [, generationString] = m; + if (generationString !== undefined) { + const generationNumber = BigInt(generationString); + if (generationNumber > 0xffffffffffffffffn) { + throw new Error(`Invalid generation number: ${generationNumber}`); + } + return { generationNumber }; + } + return { commitTime: parseCommitTime(versionString) }; +} + +function parseCommitTime(versionString: string): CommitTime { + const m = versionString.match( + /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?:(\.\d*))?Z$/, + ); + if (m === null) + throw new Error( + `Invalid commit timestamp: ${JSON.stringify(versionString)}`, + ); + const [, commitTimeString, commitTimeFractionalSeconds] = m; + return commitTimeFromSecondsAndSubseconds( + Date.parse(commitTimeString + "Z"), + commitTimeFractionalSeconds, + ); +} + +function commitTimeFromSecondsAndSubseconds( + seconds: number, + subseconds: string | undefined, +) { + let commitTime = BigInt(seconds) * 1000000n; + if (subseconds !== undefined && subseconds.length > 1) { + const fraction = Number(subseconds); + commitTime += BigInt(Math.min(999999999, Math.round(fraction * 1e9))); + } + return commitTime; +} + +export function formatCommitTime(commitTime: CommitTime) { + let fractionalSeconds = commitTime % 1000000000n; + let seconds = commitTime / 1000000000n; + if (fractionalSeconds < 0n) { + fractionalSeconds += 1000000000n; + seconds -= 1n; + } + let timestampString = new Date(Number(seconds) * 1000).toISOString(); + if (timestampString.length !== 24) { + throw new Error(`Invalid commit time: ${commitTime} -> ${timestampString}`); + } + // Strip off .nnnZ portion. + timestampString = timestampString.slice(0, 19); + if (fractionalSeconds !== 0n) { + timestampString += + "." + fractionalSeconds.toString().padStart(9, "0").replace(/0+$/, ""); + } + timestampString += "Z"; + return timestampString; +} + +const COMMIT_TIME_PREFIX_REGEXP = new RegExp( + "^" + + "(\\d{0,4})" + // year, always matches + "(?:(?<=\\d{4})-" + // month separator, only allowed after 4-digit year + "(\\d{0,2})" + // month + "(?:(?<=\\d{2})-" + // day separator, only allowed after 2-digit month + "(\\d{0,2})" + // day + "(?:(?<=\\d{2})T" + // hour separator, only allowed after 2-digit day + "(\\d{0,2})" + // hour + "(?:(?<=\\d{2}):" + // minute separator, only allowed after 2-digit hour + "(\\d{0,2})" + // minute + "(?:(?<=\\d{2}):" + // second separator, only allowed after 2-digit minute + "(\\d{0,2})" + // second + "(?:(?<=\\d{2})" + // subseconds and Z only allowed after 2-digit second + "(\\.\\d*)?" + // subseconds + "(Z)?" + // Z suffix, indicates an exact timestamp rather than a prefix + ")?" + // end of subsecond/Z group + ")?" + // end of second group + ")?" + // end of minute group + ")?" + // end of hour group + ")?" + // end of day group + ")?" + // end of month group + "$", +); + +function getMinMaxDateComponent( + componentName: string, + prefix: string | undefined, + digits: number, + inclusiveMinBound: number, + inclusiveMaxBound: number, +) { + prefix = prefix ?? ""; + const min = parseInt(prefix.padEnd(digits, "0"), 10); + const max = parseInt(prefix.padEnd(digits, "9"), 10); + if (min > inclusiveMaxBound) { + throw new Error(`Invalid ${componentName} prefix: ${prefix}`); + } + return [Math.max(inclusiveMinBound, min), Math.min(inclusiveMaxBound, max)]; +} + +function getDaysInMonth(year: number, month: number) { + const d = new Date(0); + d.setUTCFullYear(year); + d.setUTCMonth(month); + d.setUTCDate(0); + return d.getUTCDate(); +} + +export function parseCommitTimePrefix( + versionString: string, +): [CommitTime, CommitTime] { + const m = versionString.match(COMMIT_TIME_PREFIX_REGEXP); + if (m === null) { + throw new Error( + `Expected prefix of ISO-8601 "YYYY-MM-DDThh:mm:ss.sssssssssZ" format, but received: ${JSON.stringify(versionString)}`, + ); + } + const year = getMinMaxDateComponent("year", m[1], 4, 0, 9999); + const month = getMinMaxDateComponent("month", m[2], 2, 1, 12); + const daysInMaxMonth = getDaysInMonth(year[1], month[1]); + const day = getMinMaxDateComponent("day", m[3], 2, 1, daysInMaxMonth); + const hour = getMinMaxDateComponent("hour", m[4], 2, 0, 23); + const minute = getMinMaxDateComponent("minute", m[5], 2, 0, 59); + const second = getMinMaxDateComponent("second", m[6], 2, 0, 59); + const subsecondString = m[7] ?? "."; + const z = m[8]; + const minSubseconds = subsecondString.padEnd(10, "0"); + const maxSubseconds = + z === undefined ? subsecondString.padEnd(10, "9") : minSubseconds; + const subseconds = [minSubseconds, maxSubseconds]; + function getDate(i: number): CommitTime { + const date = new Date(0); + date.setUTCFullYear(year[i]); + date.setUTCMonth(month[i] - 1); + date.setUTCDate(day[i]); + date.setUTCHours(hour[i]); + date.setUTCMinutes(minute[i]); + date.setUTCSeconds(second[i]); + return commitTimeFromSecondsAndSubseconds(date.getTime(), subseconds[i]); + } + return [getDate(0), getDate(1)]; +} diff --git a/src/kvstore/ocdbt/version_tree.ts b/src/kvstore/ocdbt/version_tree.ts new file mode 100644 index 0000000000..955687f36f --- /dev/null +++ b/src/kvstore/ocdbt/version_tree.ts @@ -0,0 +1,624 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BtreeNodeReference } from "#src/kvstore/ocdbt/btree.js"; +import { readBtreeNodeReferences } from "#src/kvstore/ocdbt/btree.js"; +import type { Reader } from "#src/kvstore/ocdbt/decode_utils.js"; +import { + decodeEnvelope, + readArrayOf, + readLeb128Bigint, + readLeb128Bounded, + readStructOfArrays, + readUint64le, + readUint8, +} from "#src/kvstore/ocdbt/decode_utils.js"; +import type { + DataFileTable, + IndirectDataReference, + ReadIndirectDataReferenceOptions, +} from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import { + locationIsMissing, + readDataFileTable, + readIndirectDataReferences, +} from "#src/kvstore/ocdbt/indirect_data_reference.js"; +import type { Config } from "#src/kvstore/ocdbt/manifest.js"; +import type { VersionSpecifier } from "#src/kvstore/ocdbt/version_specifier.js"; +import { binarySearch, binarySearchLowerBound } from "#src/util/array.js"; + +export type GenerationNumber = bigint; +export type GenerationIndex = bigint; +export type VersionTreeHeight = number; +export type CommitTime = bigint; + +export interface BtreeGenerationReference { + root: BtreeNodeReference; + generationNumber: GenerationNumber; + rootHeight: VersionTreeHeight; + commitTime: CommitTime; +} + +export interface VersionNodeReference { + location: IndirectDataReference; + generationNumber: GenerationNumber; + height: VersionTreeHeight; + numGenerations: GenerationIndex; + commitTime: CommitTime; + + // Cumulative sum of `numGenerations`, including this one, starting from the + // first `VersionNodeReference` entry. + cumulativeNumGenerations: GenerationIndex; +} + +export type VersionTreeArityLog2 = number; + +export interface VersionTreeNode { + height: VersionTreeHeight; + versionTreeArityLog2: VersionTreeArityLog2; + entries: VersionNodeReference[] | BtreeGenerationReference[]; + estimatedSize: number; +} + +const MAX_VERSION_TREE_ARITY_LOG2 = 16; + +export function readVersionTreeLeafNode( + reader: Reader, + versionTreeArityLog2: number, + dataFileTable: DataFileTable, +): BtreeGenerationReference[] { + const maxNumEntries = 2 ** versionTreeArityLog2; + const numEntries = readLeb128Bounded(reader, maxNumEntries); + const entries = readVersionTreeLeafNodeEntries(reader, numEntries, { + allowMissing: true, + dataFileTable, + }); + validateVersionTreeLeafNodeEntries(entries, versionTreeArityLog2); + return entries; +} + +function readVersionTreeInteriorNode( + reader: Reader, + versionTreeArityLog2: number, + dataFileTable: DataFileTable, + height: number, +): VersionNodeReference[] { + const maxHeight = getMaxVersionTreeHeight(versionTreeArityLog2); + + if (height > maxHeight) { + throw new Error( + `height=${height} exceeds maximum of ${maxHeight} for version_tree_arity_log2=${versionTreeArityLog2}`, + ); + } + const maxArity = 2 ** versionTreeArityLog2; + const entries = readVersionTreeInteriorNodeEntries( + reader, + dataFileTable, + maxArity, + height - 1, + ); + validateVersionTreeInteriorNodeEntries(entries, versionTreeArityLog2, height); + return entries; +} + +function validateVersionTreeLeafNodeEntries( + entries: BtreeGenerationReference[], + versionTreeArityLog2: number, +): void { + const maxNumEntries = 2 ** versionTreeArityLog2; + if (entries.length === 0 || entries.length > maxNumEntries) { + throw new Error( + `num_children=${entries.length} outside valid range [1, ${maxNumEntries}]`, + ); + } + for (const [i, entry] of entries.entries()) { + if (locationIsMissing(entry.root.location)) { + if (entry.rootHeight !== 0) { + throw new Error( + `non-zero root_height=${entry.rootHeight} for empty generation ${entry.generationNumber}`, + ); + } + const { statistics } = entry.root; + if ( + statistics.numKeys !== 0n || + statistics.numTreeBytes !== 0n || + statistics.numIndirectValueBytes !== 0n + ) { + throw new Error( + `non-zero statistics for empty generation_number[${i}]=${entry.generationNumber}`, + ); + } + } + if (entry.generationNumber === 0n) { + throw new Error(`generation_number[${i}] must be non-zero`); + } + if (i !== 0) { + if (entry.generationNumber <= entries[i - 1].generationNumber) { + throw new Error( + `generation_number[${i}]=${entry.generationNumber} <= generation_number[${i - 1}]=${entries[i - 1].generationNumber}`, + ); + } + } + } + const lastGenerationNumber = entries.at(-1)!.generationNumber; + const firstGenerationNumber = entries[0].generationNumber; + const minGenerationNumber = getMinVersionTreeNodeGenerationNumber( + versionTreeArityLog2, + 0, + lastGenerationNumber, + ); + if (firstGenerationNumber < minGenerationNumber) { + throw new Error( + `Generation range [${firstGenerationNumber}, ${lastGenerationNumber}] exceeds maximum of [${minGenerationNumber}, ${lastGenerationNumber}]`, + ); + } +} + +function validateVersionTreeInteriorNodeEntries( + entries: VersionNodeReference[], + versionTreeArityLog2: number, + height: number, +): void { + const maxNumEntries = 2 ** versionTreeArityLog2; + if (entries.length === 0 || entries.length > maxNumEntries) { + throw new Error( + `num_children=${entries.length} outside valid range [1, ${maxNumEntries}]`, + ); + } + const childGenerationNumberStride = + 1n << BigInt(versionTreeArityLog2 * height); + for (const [i, entry] of entries.entries()) { + if (entry.generationNumber === 0n) { + throw new Error(`generation_number[${i}] must be non-zero`); + } + if (i !== 0) { + const prev = entries[i - 1]; + if (entry.generationNumber <= prev.generationNumber) { + throw new Error( + `generation_number[${i}]=${entry.generationNumber} >= generation_number[${i - 1}]=${prev.generationNumber}`, + ); + } + if ( + (entry.generationNumber - 1n) / childGenerationNumberStride === + (prev.generationNumber - 1n) / childGenerationNumberStride + ) { + throw new Error( + `generation_number[${i}]=${entry.generationNumber} should be in the same child node as generation_number[${i - 1}]=${prev.generationNumber}`, + ); + } + } + if (entry.generationNumber % childGenerationNumberStride !== 0n) { + throw new Error( + `generation_number[${i}]=${entry.generationNumber} is not a multiple of ${childGenerationNumberStride}`, + ); + } + if (entry.numGenerations > childGenerationNumberStride) { + throw new Error( + `num_generations[${i}]=${entry.numGenerations} for generation_number=${entry.generationNumber} is greater than ${childGenerationNumberStride}`, + ); + } + } + + const maxArity = 1n << BigInt(versionTreeArityLog2); + const lastEntry = entries.at(-1)!; + if ( + (lastEntry.generationNumber - 1n) / + childGenerationNumberStride / + maxArity !== + (entries[0].generationNumber - 1n) / childGenerationNumberStride / maxArity + ) { + throw new Error( + `generation_number[0]=${entries[0].generationNumber} cannot be in the same node as generation_number[${entries.length - 1}]=${lastEntry.generationNumber}`, + ); + } +} + +function getMinVersionTreeNodeGenerationNumber( + versionTreeArityLog2: number, + height: number, + lastGenerationNumber: GenerationNumber, +): GenerationNumber { + return ( + lastGenerationNumber - + ((lastGenerationNumber - 1n) % + (1n << BigInt(versionTreeArityLog2 * (height + 1)))) + ); +} + +export function readVersionTreeArityLog2(reader: Reader) { + const value = readUint8(reader); + if (value === 0 || value > MAX_VERSION_TREE_ARITY_LOG2) { + throw new Error( + `Expected version_tree_arity_log2 in range [1, ${MAX_VERSION_TREE_ARITY_LOG2}] but received: ${value}`, + ); + } + return value; +} + +const VERSION_TREE_NODE_MAGIC_VALUE = 0x0cdb1234; +const VERSION_TREE_NODE_FORMAT_VERSION = 0; + +export async function decodeVersionTreeNode( + buffer: ArrayBuffer, + baseUrl: string, + signal: AbortSignal, +): Promise { + try { + const { reader } = await decodeEnvelope( + buffer, + VERSION_TREE_NODE_MAGIC_VALUE, + VERSION_TREE_NODE_FORMAT_VERSION, + signal, + ); + const versionTreeArityLog2 = readVersionTreeArityLog2(reader); + const height = readUint8(reader); + const dataFileTable = readDataFileTable(reader, baseUrl); + return { + versionTreeArityLog2, + height, + entries: + height === 0 + ? readVersionTreeLeafNode(reader, versionTreeArityLog2, dataFileTable) + : readVersionTreeInteriorNode( + reader, + versionTreeArityLog2, + dataFileTable, + height, + ), + estimatedSize: reader.data.byteLength * 3, + }; + } catch (e) { + throw new Error(`Error decoding OCDBT version tree node`, { cause: e }); + } +} + +const readVersionTreeNodeInteriorNodeEntriesWithKnownCount = readStructOfArrays< + VersionNodeReference, + { dataFileTable: DataFileTable; height: number | undefined } +>({ + generationNumber: readArrayOf(readLeb128Bigint), + location: readIndirectDataReferences, + numGenerations: readArrayOf(readLeb128Bigint), + commitTime: readArrayOf(readUint64le), + height: readArrayOf((reader, { height }) => + height === undefined ? readUint8(reader) : height, + ), + cumulativeNumGenerations: readArrayOf(() => 0n), +}); + +function computeCumulativeNumGenerations(versionNodes: VersionNodeReference[]) { + let sum = 0n; + for (const ref of versionNodes) { + sum += ref.numGenerations; + ref.cumulativeNumGenerations = sum; + } +} + +export function readVersionTreeInteriorNodeEntries( + reader: Reader, + dataFileTable: DataFileTable, + maxNumEntries: number, + height: number | undefined, +) { + const numEntries = readLeb128Bounded(reader, maxNumEntries); + const entries = readVersionTreeNodeInteriorNodeEntriesWithKnownCount( + reader, + numEntries, + { dataFileTable, height }, + ); + computeCumulativeNumGenerations(entries); + return entries; +} + +export function getMaxVersionTreeHeight(versionTreeArityLog2: number): number { + return Math.floor(63 / versionTreeArityLog2) - 1; +} + +export const readVersionTreeLeafNodeEntries = readStructOfArrays< + BtreeGenerationReference, + ReadIndirectDataReferenceOptions +>({ + generationNumber: readArrayOf(readLeb128Bigint), + rootHeight: readArrayOf(readUint8), + root: readBtreeNodeReferences, + commitTime: readArrayOf(readUint64le), +}); + +export type VersionQuery = + | VersionSpecifier + | { generationIndex: GenerationIndex }; + +export function compareVersionSpecToVersion( + versionSpec: VersionSpecifier, + ref: BtreeGenerationReference, +) { + return "generationNumber" in versionSpec + ? bigintCompare(versionSpec.generationNumber, ref.generationNumber) + : bigintCompare(versionSpec.commitTime, ref.commitTime); +} + +export function bigintCompare(a: bigint, b: bigint) { + return a < b ? -1 : a > b ? 1 : 0; +} + +export function findLeafVersion( + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + version: VersionQuery, +): number { + if ("generationNumber" in version) { + return findLeafVersionByGenerationNumber( + versions, + version.generationNumber, + ); + } else if ("generationIndex" in version) { + let { generationIndex: i } = version; + i -= generationIndex; + if (i < 0n) return -1; + if (i >= BigInt(versions.length)) return versions.length; + return Number(i); + } else { + return findLeafVersionByCommitTime(versions, version.commitTime); + } +} + +function findLeafVersionByGenerationNumber( + versions: BtreeGenerationReference[], + generationNumber: GenerationNumber, +): number { + const index = binarySearch(versions, generationNumber, (a, b) => + bigintCompare(a, b.generationNumber), + ); + if (index < 0) return versions.length; + return index; +} + +function findLeafVersionByCommitTime( + versions: BtreeGenerationReference[], + commitTime: CommitTime, +): number { + const index = binarySearchLowerBound( + 0, + versions.length, + (i) => versions[i].commitTime > commitTime, + ); + if (index === 0) return versions.length; + return index - 1; +} + +// Finds the index of the first version >= version +export function findLeafVersionIndexByLowerBound( + generationIndex: GenerationIndex, + versions: BtreeGenerationReference[], + version: VersionQuery, +): number { + if ("generationIndex" in version) { + const index = version.generationIndex - generationIndex; + if (index < 0n) return 0; + if (index > BigInt(versions.length)) return versions.length; + return Number(index); + } + return binarySearchLowerBound( + 0, + versions.length, + (i) => compareVersionSpecToVersion(version, versions[i]) <= 0, + ); +} + +export function findVersionNode( + versionTreeArityLog2: VersionTreeArityLog2, + generationIndex: GenerationIndex, + versionNodes: VersionNodeReference[], + version: VersionQuery, +): VersionNodeReference | undefined { + if ("generationIndex" in version) { + return versionNodes[ + findVersionNodeIndexByGenerationIndex( + versionNodes, + version.generationIndex - generationIndex, + ) + ]; + } + return "generationNumber" in version + ? findVersionNodeByGenerationNumber( + versionTreeArityLog2, + versionNodes, + version.generationNumber, + ) + : findVersionNodeByCommitTime(versionNodes, version.commitTime); +} + +function findVersionNodeIndexByGenerationIndex( + versionNodes: VersionNodeReference[], + generationIndex: GenerationIndex, +): number { + return binarySearchLowerBound( + 0, + versionNodes.length, + (i) => versionNodes[i].cumulativeNumGenerations > generationIndex, + ); +} + +function findVersionNodeByGenerationNumber( + versionTreeArityLog2: VersionTreeArityLog2, + versionNodes: VersionNodeReference[], + generationNumber: GenerationNumber, +): VersionNodeReference | undefined { + const index = binarySearchLowerBound( + 0, + versionNodes.length, + (i) => versionNodes[i].generationNumber >= generationNumber, + ); + if (index === versionNodes.length) return undefined; + const ref = versionNodes[index]; + if ( + getMinVersionTreeNodeGenerationNumber( + versionTreeArityLog2, + ref.height, + ref.generationNumber, + ) > generationNumber + ) { + return undefined; + } + return ref; +} + +function findVersionNodeByCommitTime( + versionNodes: VersionNodeReference[], + commitTime: CommitTime, +): VersionNodeReference | undefined { + const index = binarySearchLowerBound( + 0, + versionNodes.length, + (i) => versionNodes[i].commitTime > commitTime, + ); + if (index === 0) return undefined; + return versionNodes[index - 1]; +} + +export function findVersionNodeIndexByLowerBound( + versionTreeArityLog2: VersionTreeArityLog2, + generationIndex: GenerationIndex, + versionNodes: VersionNodeReference[], + version: VersionQuery, +): number { + if ("generationIndex" in version) { + return findVersionNodeIndexByGenerationIndex( + versionNodes, + version.generationIndex - generationIndex, + ); + } + if ("generationNumber" in version) { + return findVersionNodeIndexByGenerationNumberLowerBound( + versionTreeArityLog2, + versionNodes, + version.generationNumber, + ); + } + return findVersionNodeIndexByCommitTimeLowerBound( + versionNodes, + version.commitTime, + ); +} + +function findVersionNodeIndexByGenerationNumberLowerBound( + versionTreeArityLog2: VersionTreeArityLog2, + versionNodes: VersionNodeReference[], + generationNumber: GenerationNumber, +): number { + return binarySearchLowerBound(0, versionNodes.length, (i) => { + const ref = versionNodes[i]; + return ( + getMinVersionTreeNodeGenerationNumber( + versionTreeArityLog2, + ref.height, + ref.generationNumber, + ) >= generationNumber + ); + }); +} + +function findVersionNodeIndexByCommitTimeLowerBound( + versionNodes: VersionNodeReference[], + commitTime: CommitTime, +): number { + const index = binarySearchLowerBound( + 0, + versionNodes.length, + (i) => versionNodes[i].commitTime > commitTime, + ); + return Math.max(0, index - 1); +} + +export function findVersionNodeIndexByUpperBound( + generationIndex: GenerationIndex, + versionNodes: VersionNodeReference[], + version: VersionQuery, +): number { + if ("generationIndex" in version) { + return findVersionNodeIndexByGenerationIndexUpperBound( + versionNodes, + version.generationIndex - generationIndex, + ); + } + if ("generationNumber" in version) { + return findVersionNodeIndexByGenerationNumberUpperBound( + versionNodes, + version.generationNumber, + ); + } + return findVersionNodeIndexByCommitTimeLowerBound( + versionNodes, + version.commitTime, + ); +} + +function findVersionNodeIndexByGenerationIndexUpperBound( + versionNodes: VersionNodeReference[], + generationIndex: GenerationIndex, +): number { + return binarySearchLowerBound(0, versionNodes.length, (i) => { + const node = versionNodes[i]; + return ( + node.cumulativeNumGenerations - node.numGenerations >= generationIndex + ); + }); +} + +function findVersionNodeIndexByGenerationNumberUpperBound( + versionNodes: VersionNodeReference[], + generationNumber: GenerationNumber, +): number { + return binarySearchLowerBound( + 0, + versionNodes.length, + (i) => versionNodes[i].generationNumber >= generationNumber, + ); +} + +export function validateVersionTreeNodeReference( + node: VersionTreeNode, + config: Config, + lastGenerationNumber: GenerationNumber, + height: VersionTreeHeight, + numGenerations: GenerationNumber, +): void { + if (node.height !== height) { + throw new Error( + `Expected height of ${height} but received: ${node.height}`, + ); + } + if (node.versionTreeArityLog2 !== config.versionTreeArityLog2) { + throw new Error( + `Expected version_tree_arity_log2=${config.versionTreeArityLog2} but received: ${node.versionTreeArityLog2}`, + ); + } + const { generationNumber } = node.entries.at(-1)!; + if (generationNumber !== lastGenerationNumber) { + throw new Error( + `Expected generation number ${lastGenerationNumber} but received: ${generationNumber}`, + ); + } + const actualNumGenerations = + node.height === 0 + ? BigInt(node.entries.length) + : (node.entries.at(-1) as VersionNodeReference).cumulativeNumGenerations; + if (actualNumGenerations !== numGenerations) { + throw new Error( + `Expected ${numGenerations}, but received: ${actualNumGenerations}`, + ); + } +} diff --git a/src/kvstore/proxy.ts b/src/kvstore/proxy.ts new file mode 100644 index 0000000000..f1a2f4bda3 --- /dev/null +++ b/src/kvstore/proxy.ts @@ -0,0 +1,250 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { CompletionResult } from "#src/kvstore/context.js"; +import type { + ByteRange, + DriverListOptions, + DriverReadOptions, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { SharedKvStoreContextBase } from "#src/kvstore/register.js"; +import { + LIST_RPC_ID, + READ_RPC_ID, + STAT_RPC_ID, + COMPLETE_URL_RPC_ID, +} from "#src/kvstore/shared_common.js"; +import { + finalPipelineUrlComponent, + parsePipelineUrlComponent, +} from "#src/kvstore/url.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import type { RPC } from "#src/worker_rpc.js"; +import { registerPromiseRPC } from "#src/worker_rpc.js"; + +export function proxyStat( + sharedKvStoreContext: SharedKvStoreContextBase, + url: string, + options: StatOptions, +): Promise { + return sharedKvStoreContext.rpc!.promiseInvoke( + STAT_RPC_ID, + { sharedKvStoreContext: sharedKvStoreContext.rpcId, url }, + { signal: options.signal, progressListener: options.progressListener }, + ); +} + +registerPromiseRPC( + STAT_RPC_ID, + async function ( + this: RPC, + options: { sharedKvStoreContext: number; url: string }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextBase = this.get( + options.sharedKvStoreContext, + ); + return { + value: await sharedKvStoreContext.kvStoreContext.stat( + options.url, + progressOptions, + ), + }; + }, +); + +export async function proxyRead( + sharedKvStoreContext: SharedKvStoreContextBase, + url: string, + options: DriverReadOptions, +): Promise { + const response = await sharedKvStoreContext.rpc!.promiseInvoke< + | { data: ArrayBuffer; offset: number; totalSize: number | undefined } + | undefined + >( + READ_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + url, + byteRange: options.byteRange, + throwIfMissing: options.throwIfMissing, + }, + { signal: options.signal, progressListener: options.progressListener }, + ); + if (response === undefined) return undefined; + return { + response: new Response(response.data), + offset: response.offset, + length: response.data.byteLength, + totalSize: response.totalSize, + }; +} + +registerPromiseRPC( + READ_RPC_ID, + async function ( + this: RPC, + options: { + sharedKvStoreContext: number; + url: string; + byteRange?: ByteRange; + throwIfMissing?: boolean; + }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextBase = this.get( + options.sharedKvStoreContext, + ); + const readResponse = await sharedKvStoreContext.kvStoreContext.read( + options.url, + { + ...progressOptions, + byteRange: options.byteRange, + throwIfMissing: options.throwIfMissing, + }, + ); + if (readResponse === undefined) { + return { value: undefined }; + } + const arrayBuffer = await readResponse.response.arrayBuffer(); + return { + value: { + data: arrayBuffer, + offset: readResponse.offset, + totalSize: readResponse.totalSize, + }, + transfers: [arrayBuffer], + }; + }, +); + +export function proxyList( + sharedKvStoreContext: SharedKvStoreContextBase, + url: string, + options: DriverListOptions, +): Promise { + return sharedKvStoreContext.rpc!.promiseInvoke( + LIST_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + url, + }, + { signal: options.signal, progressListener: options.progressListener }, + ); +} + +registerPromiseRPC( + LIST_RPC_ID, + async function ( + this: RPC, + options: { sharedKvStoreContext: number; url: string }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextBase = this.get( + options.sharedKvStoreContext, + ); + const { store, path } = sharedKvStoreContext.kvStoreContext.getKvStore( + options.url, + ); + return { + value: await store.list!(path, progressOptions), + }; + }, +); + +export function proxyCompleteUrl( + sharedKvStoreContext: SharedKvStoreContextBase, + url: string, + options: Partial, +): Promise { + return sharedKvStoreContext.rpc!.promiseInvoke( + COMPLETE_URL_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + url, + }, + { signal: options.signal, progressListener: options.progressListener }, + ); +} + +registerPromiseRPC( + COMPLETE_URL_RPC_ID, + async function ( + this: RPC, + options: { sharedKvStoreContext: number; url: string }, + progressOptions, + ) { + const sharedKvStoreContext: SharedKvStoreContextBase = this.get( + options.sharedKvStoreContext, + ); + const { kvStoreContext } = sharedKvStoreContext; + const { url } = options; + const finalComponent = finalPipelineUrlComponent(url); + let result: CompletionResult | undefined; + if (finalComponent === url) { + // Base kvstore + const parsedUrl = parsePipelineUrlComponent(finalComponent); + const provider = kvStoreContext.getBaseKvStoreProvider(parsedUrl); + if (provider.completeUrl !== undefined) { + result = await provider.completeUrl({ + url: parsedUrl, + ...progressOptions, + }); + } + } else { + const adapterUrl = parsePipelineUrlComponent(finalComponent); + const provider = kvStoreContext.getKvStoreAdapterProvider(adapterUrl); + const baseUrl = url.slice(0, url.length - finalComponent.length - 1); + const base = kvStoreContext.getKvStore(baseUrl); + if (provider.completeUrl !== undefined) { + result = await provider.completeUrl({ + url: adapterUrl, + base, + ...progressOptions, + }); + } + } + return { + value: result, + }; + }, +); + +export abstract class ProxyReadableKvStore { + constructor(public sharedKvStoreContext: SharedKvStoreContextBase) {} + + abstract getUrl(key: Key): string; + + stat(key: Key, options: StatOptions): Promise { + return proxyStat(this.sharedKvStoreContext, this.getUrl(key), options); + } + read( + key: Key, + options: DriverReadOptions, + ): Promise { + return proxyRead(this.sharedKvStoreContext, this.getUrl(key), options); + } +} + +export abstract class ProxyKvStore extends ProxyReadableKvStore { + list(prefix: string, options: DriverListOptions): Promise { + return proxyList(this.sharedKvStoreContext, this.getUrl(prefix), options); + } +} diff --git a/src/kvstore/register.ts b/src/kvstore/register.ts new file mode 100644 index 0000000000..de6fc91d6a --- /dev/null +++ b/src/kvstore/register.ts @@ -0,0 +1,79 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { AutoDetectRegistry } from "#src/kvstore/auto_detect.js"; +import type { + BaseKvStoreProvider, + KvStoreAdapterProvider, + KvStoreContext, +} from "#src/kvstore/context.js"; +import type { StringMemoize } from "#src/util/memoize.js"; +import type { RPC, RpcId } from "#src/worker_rpc.js"; + +export interface SharedKvStoreContextBase { + kvStoreContext: KvStoreContext; + credentialsManager: CredentialsManager; + chunkManager: { memoize: StringMemoize }; + rpc: RPC | null; + rpcId: RpcId | null; +} + +export class KvStoreProviderRegistry< + SharedKvStoreContext extends SharedKvStoreContextBase, +> { + baseKvStoreProviders: Array< + (context: SharedKvStoreContext) => BaseKvStoreProvider + > = []; + kvStoreAdapterProviders: Array< + (context: SharedKvStoreContext) => KvStoreAdapterProvider + > = []; + autoDetectRegistry = new AutoDetectRegistry(); + + registerBaseKvStoreProvider( + provider: (context: SharedKvStoreContext) => BaseKvStoreProvider, + ) { + this.baseKvStoreProviders.push(provider); + } + + registerKvStoreAdapterProvider( + provider: (context: SharedKvStoreContext) => KvStoreAdapterProvider, + ) { + this.kvStoreAdapterProviders.push(provider); + } + + applyToContext(context: SharedKvStoreContext) { + const { kvStoreContext } = context; + for (const key of [ + "baseKvStoreProviders", + "kvStoreAdapterProviders", + ] as const) { + const map = kvStoreContext[key]; + for (const providerFactory of this[key]) { + const provider = providerFactory(context); + const { scheme } = provider; + if (map.has(scheme)) { + throw new Error(`Duplicate kvstore scheme ${scheme}`); + } + map.set(scheme, provider as any); + } + } + this.autoDetectRegistry.copyTo(context.kvStoreContext.autoDetectRegistry); + } +} + +export const frontendBackendIsomorphicKvStoreProviderRegistry = + new KvStoreProviderRegistry(); diff --git a/src/kvstore/s3/backend.ts b/src/kvstore/s3/backend.ts new file mode 100644 index 0000000000..7577a34618 --- /dev/null +++ b/src/kvstore/s3/backend.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import type { DriverListOptions, ListResponse } from "#src/kvstore/index.js"; +import { proxyList } from "#src/kvstore/proxy.js"; +import { ReadableS3KvStore } from "#src/kvstore/s3/common.js"; + +export class S3KvStore extends ReadableS3KvStore { + list(prefix: string, options: DriverListOptions): Promise { + return proxyList(this.sharedKvStoreContext, this.getUrl(prefix), options); + } +} diff --git a/src/kvstore/s3/common.ts b/src/kvstore/s3/common.ts new file mode 100644 index 0000000000..e1e19ca06f --- /dev/null +++ b/src/kvstore/s3/common.ts @@ -0,0 +1,175 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { BaseKvStoreProvider } from "#src/kvstore/context.js"; +import { read, stat } from "#src/kvstore/http/read.js"; +import type { + KvStore, + DriverListOptions, + ListResponse, + DriverReadOptions, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import type { + KvStoreProviderRegistry, + SharedKvStoreContextBase, +} from "#src/kvstore/register.js"; +import { + getS3BucketListing, + listS3CompatibleUrl, +} from "#src/kvstore/s3/list.js"; +import { joinBaseUrlAndPath } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import { fetchOk } from "#src/util/http_request.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export class ReadableS3KvStore< + SharedKvStoreContext extends SharedKvStoreContextBase, +> implements KvStore +{ + constructor( + public sharedKvStoreContext: SharedKvStoreContext, + public baseUrl: string, + public baseUrlForDisplay: string, + protected knownToBeVirtualHostedStyle: boolean, + protected fetchOkImpl: FetchOk = fetchOk, + ) {} + + stat(key: string, options: StatOptions): Promise { + const url = joinBaseUrlAndPath(this.baseUrl, key); + return stat(this, key, url, options, this.fetchOkImpl); + } + + read( + key: string, + options: DriverReadOptions, + ): Promise { + const url = joinBaseUrlAndPath(this.baseUrl, key); + return read(this, key, url, options, this.fetchOkImpl); + } + + list(prefix: string, options: DriverListOptions): Promise { + const { progressListener } = options; + using _span = + progressListener === undefined + ? undefined + : new ProgressSpan(progressListener, { + message: `Listing prefix ${this.getUrl(prefix)}`, + }); + if (this.knownToBeVirtualHostedStyle) { + return getS3BucketListing( + this.baseUrl, + prefix, + this.fetchOkImpl, + options, + ); + } + return listS3CompatibleUrl( + joinBaseUrlAndPath(this.baseUrl, prefix), + this.baseUrlForDisplay, + this.sharedKvStoreContext.chunkManager.memoize, + this.fetchOkImpl, + options, + ); + } + + getUrl(path: string) { + return joinBaseUrlAndPath(this.baseUrlForDisplay, path); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} + +function amazonS3Provider< + SharedKvStoreContext extends SharedKvStoreContextBase, +>( + sharedKvStoreContext: SharedKvStoreContext, + s3KvStoreClass: typeof ReadableS3KvStore, +): BaseKvStoreProvider { + return { + scheme: "s3", + description: "S3 (anonymous)", + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error("Invalid URL, expected `s3:///`"); + } + const [, bucket, path] = m; + return { + store: new s3KvStoreClass( + sharedKvStoreContext, + `https://${bucket}.s3.amazonaws.com/`, + `s3://${bucket}/`, + /*knownToBeVirtualHostedStyle=*/ true, + ), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +function s3Provider( + sharedKvStoreContext: SharedKvStoreContext, + httpScheme: "http" | "https", + s3KvStoreClass: typeof ReadableS3KvStore, +): BaseKvStoreProvider { + return { + scheme: `s3+${httpScheme}`, + description: `S3-compatible ${httpScheme} server`, + getKvStore(url) { + const m = (url.suffix ?? "").match(/^\/\/([^/]+)(\/.*)?$/); + if (m === null) { + throw new Error( + "Invalid URL, expected `s3+${httpScheme}:///`", + ); + } + const [, host, path] = m; + return { + store: new s3KvStoreClass( + sharedKvStoreContext, + `${httpScheme}://${host}/`, + `s3+${httpScheme}://${host}/`, + /*knownToBeVirtualHostedStyle=*/ false, + ), + path: decodeURIComponent((path ?? "").substring(1)), + }; + }, + }; +} + +export function registerProviders< + SharedKvStoreContext extends SharedKvStoreContextBase, +>( + registry: KvStoreProviderRegistry, + s3KvStoreClass: typeof ReadableS3KvStore, +) { + registry.registerBaseKvStoreProvider((context) => + amazonS3Provider(context, s3KvStoreClass), + ); + + for (const httpScheme of ["http", "https"] as const) { + registry.registerBaseKvStoreProvider((context) => + s3Provider(context, httpScheme, s3KvStoreClass), + ); + } +} diff --git a/src/kvstore/s3/frontend.ts b/src/kvstore/s3/frontend.ts new file mode 100644 index 0000000000..b9c4fee91d --- /dev/null +++ b/src/kvstore/s3/frontend.ts @@ -0,0 +1,52 @@ +/** + * @license + * Copyright 2023 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { DriverListOptions, ListResponse } from "#src/kvstore/index.js"; +import { ReadableS3KvStore } from "#src/kvstore/s3/common.js"; +import { + getS3BucketListing, + listS3CompatibleUrl, +} from "#src/kvstore/s3/list.js"; +import { joinBaseUrlAndPath } from "#src/kvstore/url.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +export class S3KvStore extends ReadableS3KvStore { + list(prefix: string, options: DriverListOptions): Promise { + const { progressListener } = options; + using _span = + progressListener === undefined + ? undefined + : new ProgressSpan(progressListener, { + message: `Listing prefix ${this.getUrl(prefix)}`, + }); + if (this.knownToBeVirtualHostedStyle) { + return getS3BucketListing( + this.baseUrl, + prefix, + this.fetchOkImpl, + options, + ); + } + return listS3CompatibleUrl( + joinBaseUrlAndPath(this.baseUrl, prefix), + this.baseUrlForDisplay, + this.sharedKvStoreContext.chunkManager.memoize, + this.fetchOkImpl, + options, + ); + } +} diff --git a/src/kvstore/s3/index.rst b/src/kvstore/s3/index.rst new file mode 100644 index 0000000000..52bbbb165a --- /dev/null +++ b/src/kvstore/s3/index.rst @@ -0,0 +1,71 @@ +.. _s3-kvstore: + +S3 +== + +The S3 key-value store is a :ref:`root key-value store` for +accessing S3 buckets hosted by Amazon as well as other S3-compatible servers. + +URL syntax +---------- + +- :file:`s3://{bucket}/{path}` + + Specifies an Amazon S3 bucket (with the endpoint + :file:`{bucket}.s3.amazonaws.com`). + +- :file:`s3+http{s}://{host}/{path}` or :file:`s3+http{s}://{host}/{bucket}/{path}` + + Specifies an S3-compatible server at :file:`http://{host}` or + :file:`https://{host}`. + + .. note:: + + This URL syntax can ambiguously specify either: + + - a virtual hosted-style URL :file:`s3+https://{host}/{path}`, where + :file:`https://{host}` refers to a single bucket, or + - a path-style URL :file:`s3+https://{host}/{bucket}/{path}`, where the + :file:`{bucket}` is specified as the first component of the path. + + Neuroglancer automatically detects which of these cases applies. + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - Supported + * - :ref:`kvstore-listing` + - Supported with ``s3:ListBucket`` permission. + +Authentication +-------------- + +Currently, only anonymous access is supported. + +CORS +---- + +If the Neuroglancer client itself is not hosted in the same S3 bucket, the +bucket must be configured with a `CORS policy +`__ +such as the following: + +.. code-block:: json + + [ + { + "AllowedHeaders": [ + "*" + ], + "AllowedOrigins": [ + "*" + ], + "ExposeHeaders": [ + "*" + ], + "MaxAgeSeconds": 3000 + } + ] diff --git a/src/kvstore/s3/list.ts b/src/kvstore/s3/list.ts new file mode 100644 index 0000000000..94eedfc384 --- /dev/null +++ b/src/kvstore/s3/list.ts @@ -0,0 +1,237 @@ +/** + * @license + * Copyright 2019 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { ListEntry, ListResponse } from "#src/kvstore/index.js"; +import { encodePathForUrl, getBaseHttpUrlAndPath } from "#src/kvstore/url.js"; +import type { FetchOk } from "#src/util/http_request.js"; +import type { StringMemoize } from "#src/util/memoize.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +const EXPECTED_XML_NAMESPACE_URIS = [ + "http://doc.s3.amazonaws.com/2006-03-01/", + "http://s3.amazonaws.com/doc/2006-03-01/", +]; + +function isValidListObjectsResponse(documentElement: Element): boolean { + return ( + EXPECTED_XML_NAMESPACE_URIS.includes(documentElement.namespaceURI!) && + documentElement.tagName === "ListBucketResult" + ); +} + +export function isS3ListResponse(text: string): boolean { + let doc: Document; + try { + doc = new DOMParser().parseFromString(text, "application/xml"); + } catch { + return false; + } + return isValidListObjectsResponse(doc.documentElement); +} + +export async function getS3BucketListing( + bucketUrl: string, + prefix: string, + fetchOkImpl: FetchOk, + options: Partial, +): Promise { + const delimiter = "/"; + try { + const response = await fetchOkImpl( + `${bucketUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}` + + `&delimiter=${encodeURIComponent(delimiter)}&encoding-type=url`, + /*init=*/ { + headers: { accept: "application/xml,text/xml" }, + signal: options.signal, + progressListener: options.progressListener, + }, + ); + const contentType = response.headers.get("content-type"); + // Per https://github.com/getmoto/moto/issues/8560, also allow text/html. + if ( + contentType === null || + /\b(application\/xml|text\/xml|text\/html)\b/i.exec(contentType) === null + ) { + throw new Error(`Expected XML content-type but received: ${contentType}`); + } + const text = await response.text(); + const doc = new DOMParser().parseFromString(text, "application/xml"); + const { documentElement } = doc; + if (!isValidListObjectsResponse(documentElement)) { + throw new Error( + `Received unexpected XML root element <${documentElement.tagName} xmlns="${documentElement.namespaceURI}">`, + ); + } + const namespaceURI = documentElement.namespaceURI!; + const namespaceResolver: XPathNSResolver = () => namespaceURI; + const commonPrefixNodes = doc.evaluate( + "//CommonPrefixes/Prefix", + doc, + namespaceResolver, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + const directories: string[] = []; + for (let i = 0, n = commonPrefixNodes.snapshotLength; i < n; ++i) { + let name = commonPrefixNodes.snapshotItem(i)!.textContent; + if (name === null) continue; + name = decodeURIComponent(name); + // Exclude delimiter from end of `name`. + directories.push(name.substring(0, name.length - delimiter.length)); + } + + const entries: ListEntry[] = []; + const contents = doc.evaluate( + "//Contents/Key", + doc, + namespaceResolver, + XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + for (let i = 0, n = contents.snapshotLength; i < n; ++i) { + const name = contents.snapshotItem(i)!.textContent; + if (name === null) continue; + entries.push({ key: decodeURIComponent(name) }); + } + return { directories, entries }; + } catch (e) { + throw new Error(`S3-compatible listing not supported`, { cause: e }); + } +} + +function getVirtualHostedStyleListing( + url: string, + fetchOkImpl: FetchOk, + options: Partial, +): Promise { + const { baseUrl, path } = getBaseHttpUrlAndPath(url); + return getS3BucketListing(baseUrl, path, fetchOkImpl, options); +} + +function parsePathStyleUrl(url: string): + | { + bucketUrl: string; + bucket: string; + prefix: string; + } + | undefined { + const u = new URL(url); + const m = u.pathname.match(/^\/([^/]+)(?:\/(.*))$/)!; + if (m === null) { + return undefined; + } + const [, bucket, path] = m; + return { + bucketUrl: `${u.origin}/${bucket}/${u.search}`, + bucket: decodeURIComponent(bucket), + prefix: decodeURIComponent(path), + }; +} + +async function getPathStyleListing( + url: string, + fetchOkImpl: FetchOk, + options: Partial, +): Promise { + const parsed = parsePathStyleUrl(url); + if (parsed === undefined) { + throw new Error( + `Path-style S3 URL ${JSON.stringify(url)} must specify bucket`, + ); + } + const { bucketUrl, bucket, prefix } = parsed; + const response = await getS3BucketListing( + bucketUrl, + prefix, + fetchOkImpl, + options, + ); + const bucketPrefix = encodePathForUrl(bucket) + "/"; + return { + entries: response.entries.map((entry) => ({ + key: bucketPrefix + entry.key, + })), + directories: response.directories.map((name) => bucketPrefix + name), + }; +} + +export type S3UrlKind = "virtual" | "path"; + +// Map of known S3-compatible servers, indicating the URL type. +// +// The key is the origin / base URL. +// +// A value of `null` indicates that S3-style listing is not supported. +function getUrlKindCache(memoize: StringMemoize) { + return memoize.getUncounted( + "s3:urlkind", + () => new Map(), + ); +} + +// Lists an S3-compatible URL. +// +// Both virtual hosted-style URLS `https://{host}/{path}` and +// `https://{host}/{bucket}/{path}` are supported. +export async function listS3CompatibleUrl( + url: string, + origin: string, + memoize: StringMemoize, + fetchOkImpl: FetchOk, + options: Partial, +): Promise { + const cache = getUrlKindCache(memoize); + const urlKind = cache.get(origin); + if (urlKind === "virtual") { + return await getVirtualHostedStyleListing(url, fetchOkImpl, options); + } + if (urlKind === "path") { + return await getPathStyleListing(url, fetchOkImpl, options); + } + if (urlKind !== null) { + try { + const { result, urlKind } = await Promise.any([ + getVirtualHostedStyleListing(url, fetchOkImpl, options).then( + (result) => ({ + result, + urlKind: "virtual" as const, + }), + ), + getPathStyleListing(url, fetchOkImpl, options).then((result) => ({ + result, + urlKind: "path" as const, + })), + ]); + cache.set(origin, urlKind); + return result; + } catch (e) { + options.signal?.throwIfAborted(); + cache.set(origin, null); + throw new Error( + `Neither virtual hosted nor path-style S3 listing supported`, + { cause: e }, + ); + } + } + throw new Error(`Neither virtual hosted nor path-style S3 listing supported`); +} + +export function getS3UrlKind( + memoize: StringMemoize, + origin: string, +): S3UrlKind | null | undefined { + return getUrlKindCache(memoize).get(origin); +} diff --git a/src/kvstore/s3/register_backend.ts b/src/kvstore/s3/register_backend.ts new file mode 100644 index 0000000000..279ead166e --- /dev/null +++ b/src/kvstore/s3/register_backend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import { S3KvStore } from "#src/kvstore/s3/backend.js"; +import { registerProviders } from "#src/kvstore/s3/common.js"; + +registerProviders(backendOnlyKvStoreProviderRegistry, S3KvStore); diff --git a/src/kvstore/s3/register_frontend.ts b/src/kvstore/s3/register_frontend.ts new file mode 100644 index 0000000000..7ce30238e2 --- /dev/null +++ b/src/kvstore/s3/register_frontend.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { registerProviders } from "#src/kvstore/s3/common.js"; +import { S3KvStore } from "#src/kvstore/s3/frontend.js"; + +registerProviders(frontendOnlyKvStoreProviderRegistry, S3KvStore); diff --git a/src/kvstore/shared_common.ts b/src/kvstore/shared_common.ts new file mode 100644 index 0000000000..fdf31f3480 --- /dev/null +++ b/src/kvstore/shared_common.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export const SHARED_KVSTORE_CONTEXT_RPC_ID = "SharedKvStoreContext"; + +export const STAT_RPC_ID = "SharedKvStoreContext.stat"; +export const READ_RPC_ID = "SharedKvStoreContext.read"; +export const LIST_RPC_ID = "SharedKvStoreContext.list"; +export const COMPLETE_URL_RPC_ID = "SharedKvStoreContext.completeUrl"; diff --git a/src/kvstore/special/index.ts b/src/kvstore/special/index.ts deleted file mode 100644 index ac9ee232aa..0000000000 --- a/src/kvstore/special/index.ts +++ /dev/null @@ -1,185 +0,0 @@ -/** - * @license - * Copyright 2023 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { - ByteRange, - ByteRangeRequest, - ReadableKvStore, - ReadOptions, - ReadResponse, -} from "#src/kvstore/index.js"; -import { composeByteRangeRequest } from "#src/kvstore/index.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import { isNotFoundError } from "#src/util/http_request.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; - -function getRangeHeader( - request: ByteRangeRequest | undefined, -): string | undefined { - if (request === undefined) return undefined; - if ("suffixLength" in request) { - return `bytes=-${request.suffixLength}`; - } - return `bytes=${request.offset}-${request.offset + request.length - 1}`; -} - -/** - * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the - * cache is disabled. Disabling the cache works around the problem. - * - * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 - */ -const byteRangeCacheMode = - navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; - -class SpecialProtocolKvStore implements ReadableKvStore { - constructor( - public credentialsProvider: SpecialProtocolCredentialsProvider, - public baseUrl: string, - ) {} - - async getObjectLength(url: string, options: ReadOptions) { - // Use a HEAD request to get the length of an object - const { cancellationToken = uncancelableToken } = options; - const headResponse = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - { method: "HEAD" }, - async (response) => response, - cancellationToken, - ); - - if (headResponse.status !== 200) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLength = headResponse.headers.get("content-length"); - if (contentLength === undefined) { - throw new Error( - "Failed to determine total size in order to fetch suffix", - ); - } - const contentLengthNumber = Number(contentLength); - return contentLengthNumber; - } - - async read( - key: string, - options: ReadOptions, - ): Promise { - const { cancellationToken = uncancelableToken } = options; - let { byteRange: byteRangeRequest } = options; - const url = this.baseUrl + key; - - try { - // The HTTP spec supports suffixLength requests directly via "Range: - // bytes=-N" requests, which avoids the need for a separate HEAD request. - // However, per - // https://fetch.spec.whatwg.org/#cors-safelisted-request-header a suffix - // length byte range request header will always trigger an OPTIONS preflight - // request, which would otherwise be avoided. This negates the benefit of - // using a suffixLength request directly. Additionally, some servers such as - // the npm http-server package and https://uk1s3.embassy.ebi.ac.uk/ do not - // correctly handle suffixLength requests or do not correctly handle CORS - // preflight requests. To avoid those issues, always just issue a separate - // HEAD request to determine the length. - let totalSize: number | undefined; - if ( - byteRangeRequest !== undefined && - "suffixLength" in byteRangeRequest - ) { - const totalSize = await this.getObjectLength(url, options); - byteRangeRequest = composeByteRangeRequest( - { offset: 0, length: totalSize }, - byteRangeRequest, - ).outer; - } - const requestInit: RequestInit = {}; - const rangeHeader = getRangeHeader(byteRangeRequest); - if (rangeHeader !== undefined) { - requestInit.headers = { range: rangeHeader }; - requestInit.cache = byteRangeCacheMode; - } - const { response, data } = await cancellableFetchSpecialOk( - this.credentialsProvider, - url, - requestInit, - async (response) => ({ - response, - data: await response.arrayBuffer(), - }), - cancellationToken, - ); - let byteRange: ByteRange | undefined; - if (response.status === 206) { - const contentRange = response.headers.get("content-range"); - if (contentRange === null) { - // Content-range should always be sent, but some buggy servers don't - // send it. - if (byteRangeRequest !== undefined) { - byteRange = { - offset: byteRangeRequest.offset, - length: data.byteLength, - }; - } else { - throw new Error( - "Unexpected HTTP 206 response when no byte range specified.", - ); - } - } - if (contentRange !== null) { - const m = contentRange.match(/bytes ([0-9]+)-([0-9]+)\/([0-9]+|\*)/); - if (m === null) { - throw new Error( - `Invalid content-range header: ${JSON.stringify(contentRange)}`, - ); - } - const beginPos = parseInt(m[1], 10); - const endPos = parseInt(m[2], 10); - if (endPos !== beginPos + data.byteLength - 1) { - throw new Error( - `Length in content-range header ${JSON.stringify( - contentRange, - )} does not match content length ${data.byteLength}`, - ); - } - if (m[3] !== "*") { - totalSize = parseInt(m[3], 10); - } - byteRange = { offset: beginPos, length: data.byteLength }; - } - } - if (byteRange === undefined) { - byteRange = { offset: 0, length: data.byteLength }; - totalSize = data.byteLength; - } - return { data: new Uint8Array(data), dataRange: byteRange, totalSize }; - } catch (e) { - if (isNotFoundError(e)) { - return undefined; - } - throw e; - } - } -} -export function getSpecialProtocolKvStore( - credentialsProvider: SpecialProtocolCredentialsProvider, - baseUrl: string, -): ReadableKvStore { - return new SpecialProtocolKvStore(credentialsProvider, baseUrl); -} diff --git a/src/kvstore/url.ts b/src/kvstore/url.ts new file mode 100644 index 0000000000..642b1560e3 --- /dev/null +++ b/src/kvstore/url.ts @@ -0,0 +1,221 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function kvstoreEnsureDirectoryPipelineUrl(url: string): string { + const m = url.match( + /^((?:.*?\|)?)([a-zA-Z][a-zA-Z0-9-+.]*)(?:(:[^?#|]*)((?:[?#][^|]*)?))?$/, + ); + if (m === null) { + throw new Error(`Invalid URL: ${url}`); + } + const [, pipelinePrefix, scheme, path, queryAndFragment] = m; + if (path === undefined) { + return `${pipelinePrefix}${scheme}:`; + } + if (path === ":" || path.endsWith("/")) return url; + return `${pipelinePrefix}${scheme}${path}/${queryAndFragment ?? ""}`; +} + +export function finalPipelineUrlComponent(url: string) { + // match is infallible + const m = url.match(/.*?([^|]*)$/)!; + return m[1]; +} + +export const schemePattern = /^(?:([a-zA-Z][a-zA-Z0-9-+.]*):)?(.*)$/; + +export function parsePipelineUrlComponent(url: string): UrlWithParsedScheme { + // schemePattern always matches + const m = url.match(schemePattern)!; + const scheme = m[1]; + const suffix = m[2]; + if (scheme === undefined) { + return { url, scheme: url, suffix: undefined }; + } else { + return { url, scheme: scheme, suffix }; + } +} + +export const urlComponentPattern = + /^(?:([a-zA-Z][a-zA-Z0-9-+.]*):)?([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/; + +export function parseUrlSuffix(suffix: string | undefined): { + authorityAndPath: string | undefined; + query: string | undefined; + fragment: string | undefined; +} { + if (suffix === undefined) { + return { + authorityAndPath: undefined, + query: undefined, + fragment: undefined, + }; + } + // Infallible pattern. + const [, authorityAndPath, query, fragment] = suffix.match( + /^([^?#]*)(?:\?([^#]*))?(?:#(.*))?$/, + )!; + return { + authorityAndPath, + query: query ?? undefined, + fragment: fragment ?? undefined, + }; +} + +export interface UrlWithParsedScheme { + // Full original URL. + url: string; + + // Scheme (excluding ":"). + scheme: string; + + // Suffix following ":", including initial "//" if present. + suffix: string | undefined; +} + +// Splits a URL containing multiple "|"-separate parts. +export function splitPipelineUrl(url: string): UrlWithParsedScheme[] { + return url.split("|").map(parsePipelineUrlComponent); +} + +export function pipelineUrlJoin( + baseUrl: string, + ...additionalParts: string[] +): string { + // Strip off any ? or # parameters, since they are not part of the path. + // Infallible pattern + let [, base, queryAndFragment] = baseUrl.match(/^(.*?[^|?#]*)([^|]*)$/)!; + for (let part of additionalParts) { + if (part.startsWith("/")) { + part = part.substring(1); + } + if (part === "") continue; + base = kvstoreEnsureDirectoryPipelineUrl(base); + base += encodePathForUrl(part); + } + return base + queryAndFragment; +} + +export function joinPath(base: string, ...additionalParts: string[]) { + for (let part of additionalParts) { + if (part.startsWith("/")) { + part = part.substring(1); + } + if (part === "") continue; + base = ensurePathIsDirectory(base); + base += part; + } + return base; +} + +export function ensurePathIsDirectory(path: string) { + if (!pathIsDirectory(path)) { + path += "/"; + } + return path; +} + +export function ensureNoQueryOrFragmentParameters(url: UrlWithParsedScheme) { + const { suffix } = url; + if (suffix === undefined) return; + if (suffix.match(/[#?]/)) { + throw new Error( + `Invalid URL ${url.url}: query parameters and/or fragment not supported`, + ); + } +} + +export function ensureEmptyUrlSuffix(url: UrlWithParsedScheme) { + if (url.suffix) { + throw new Error( + `Invalid URL syntax ${JSON.stringify(url.url)}, expected "${url.scheme}:"`, + ); + } +} + +export function extractQueryAndFragment(url: string): { + base: string; + queryAndFragment: string; +} { + const [, base, queryAndFragment] = url.match(/^(.*?[^|?#]*)([^|]*)$/)!; + return { base, queryAndFragment }; +} + +// Resolves `relativePath` relative to `basePath`. +// +// Note that the parameters are both expected to be plain paths, not full URLs +// or URL pipelines. +export function resolveRelativePath(basePath: string, relativePath: string) { + const origBasePath = basePath; + if (basePath.endsWith("/")) { + basePath = basePath.substring(0, basePath.length - 1); + } + for (const component of relativePath.split("/")) { + if (component === "" || component === ".") { + continue; + } + if (component === "..") { + const prevSlash = basePath.lastIndexOf("/"); + if (prevSlash <= 0) { + throw new Error( + `Invalid relative path ${JSON.stringify(relativePath)} from base path ${JSON.stringify(origBasePath)}`, + ); + } + basePath = basePath.substring(0, prevSlash); + continue; + } + if (basePath !== "") { + basePath += "/"; + } + basePath += component; + } + if (relativePath.endsWith("/")) { + basePath += "/"; + } + return basePath; +} + +export function pathIsDirectory(path: string) { + return path === "" || path.endsWith("/"); +} + +// Plain paths can have arbitrary characters, but to be included in a URL +// pipeline, special characters must be percent encoded. +export function encodePathForUrl(path: string) { + return encodeURI(path).replace( + /[?#@]/g, + (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`, + ); +} + +export function joinBaseUrlAndPath(baseUrl: string, path: string) { + const { base, queryAndFragment } = extractQueryAndFragment(baseUrl); + return base + encodePathForUrl(path) + queryAndFragment; +} + +export function getBaseHttpUrlAndPath(url: string) { + const parsed = new URL(url); + if (parsed.hash) { + throw new Error("fragment not supported"); + } + if (parsed.username || parsed.password) { + throw new Error("basic auth credentials not supported"); + } + return { + baseUrl: `${parsed.origin}/${parsed.search}`, + path: decodeURIComponent(parsed.pathname.substring(1)), + }; +} diff --git a/src/kvstore/zip/auto_detect.ts b/src/kvstore/zip/auto_detect.ts new file mode 100644 index 0000000000..521002f6f7 --- /dev/null +++ b/src/kvstore/zip/auto_detect.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + AutoDetectFileOptions, + AutoDetectMatch, + AutoDetectRegistry, +} from "#src/kvstore/auto_detect.js"; +import { + EOCDR_WITHOUT_COMMENT_SIZE, + parseEndOfCentralDirectoryRecord, +} from "#src/kvstore/zip/metadata.js"; + +async function detectZip( + options: AutoDetectFileOptions, +): Promise { + const { suffix } = options; + if (suffix === undefined) return []; + if (parseEndOfCentralDirectoryRecord(suffix) === undefined) return []; + return [{ suffix: "zip:", description: "ZIP archive" }]; +} + +export function registerAutoDetect(registry: AutoDetectRegistry) { + registry.registerFileFormat({ + prefixLength: 0, + // To ensure all valid zip file are detected, this should be set to + // `EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE`. In practice, though, zip + // files with comments are rare and 4096 should be sufficient for most + // cases while avoiding reading an excessive amount for auto-detection. + suffixLength: EOCDR_WITHOUT_COMMENT_SIZE + 4096, + match: detectZip, + }); +} diff --git a/src/kvstore/zip/backend.ts b/src/kvstore/zip/backend.ts new file mode 100644 index 0000000000..4aba3590e7 --- /dev/null +++ b/src/kvstore/zip/backend.ts @@ -0,0 +1,256 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/proxy.js"; +import type { ChunkManager } from "#src/chunk_manager/backend.js"; +import { makeSimpleAsyncCache } from "#src/chunk_manager/generic_file_source.js"; +import { FileByteRangeHandle } from "#src/kvstore/byte_range/file_handle.js"; +import { GzipFileHandle } from "#src/kvstore/gzip/file_handle.js"; +import type { + DriverListOptions, + DriverReadOptions, + FileHandle, + KvStore, + ListEntry, + ListResponse, + ReadResponse, + StatOptions, + StatResponse, +} from "#src/kvstore/index.js"; +import { readFileHandle } from "#src/kvstore/index.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; +import type { + ZipMetadata, + Reader, + ZipEntry, +} from "#src/kvstore/zip/metadata.js"; +import { + readZipMetadata, + readEntryDataHeader, + ZipCompressionMethod, +} from "#src/kvstore/zip/metadata.js"; +import { + binarySearch, + binarySearchLowerBound, + filterArrayInplace, +} from "#src/util/array.js"; +import { + ProgressSpan, + type ProgressOptions, +} from "#src/util/progress_listener.js"; +import { defaultStringCompare } from "#src/util/string.js"; + +function makeZipReader(base: FileHandle): Reader { + return async ( + offset: number, + length: number, + options: Partial, + ) => { + const readResponse = await readFileHandle(base, { + throwIfMissing: true, + byteRange: { offset, length }, + strictByteRange: true, + signal: options.signal, + progressListener: options.progressListener, + }); + return new Uint8Array(await readResponse.response.arrayBuffer()); + }; +} + +interface CachedZipEntry extends ZipEntry { + fileDataStart?: number; +} + +interface CachedZipMetadata extends ZipMetadata { + entries: CachedZipEntry[]; +} + +function getZipMetadataCache(chunkManager: ChunkManager, base: FileHandle) { + const url = base.getUrl(); + return makeSimpleAsyncCache(chunkManager, `zipMetadata:${url}`, { + get: async (_unusedCacheKey: undefined, progressOptions) => { + using _span = new ProgressSpan(progressOptions.progressListener, { + message: `Reading ZIP central directory from ${url}`, + }); + const statResponse = await base.stat(progressOptions); + if (statResponse?.totalSize === undefined) { + throw new Error(`Failed to determine ZIP file size: ${url}`); + } + const metadata = await readZipMetadata( + makeZipReader(base), + statResponse.totalSize, + progressOptions, + ); + // Zip files sometimes contain zero-length files corresponding to + // directories. + filterArrayInplace( + metadata.entries, + (entry) => !entry.fileName.endsWith("/"), + ); + metadata.entries.sort((a, b) => + defaultStringCompare(a.fileName, b.fileName), + ); + return { data: metadata, size: metadata.sizeEstimate }; + }, + }); +} + +async function getZipMetadata( + chunkManager: ChunkManager, + base: FileHandle, + options: Partial, +): Promise { + const cache = getZipMetadataCache(chunkManager, base); + try { + return (await cache.get(undefined, options)) as CachedZipMetadata; + } finally { + cache.dispose(); + } +} + +function findEntry( + metadata: CachedZipMetadata, + key: string, +): CachedZipEntry | undefined { + const { entries } = metadata; + const index = binarySearch(entries, key, (key, entry) => + defaultStringCompare(key, entry.fileName), + ); + if (index < 0) return undefined; + return entries[index]; +} + +function list(metadata: ZipMetadata, prefix: string) { + const { entries } = metadata; + const startIndex = binarySearchLowerBound( + 0, + entries.length, + (index) => entries[index].fileName >= prefix, + ); + + const endIndex = binarySearchLowerBound( + Math.min(entries.length, startIndex + 1), + entries.length, + (index) => !entries[index].fileName.startsWith(prefix), + ); + + const listEntries: ListEntry[] = []; + const directories: string[] = []; + + for (let index = startIndex; index < endIndex; ) { + const entry = entries[index]; + const i = entry.fileName.indexOf("/", prefix.length); + if (i === -1) { + // Filename + listEntries.push({ key: entry.fileName }); + ++index; + } else { + // Directory + directories.push(entry.fileName.substring(0, i)); + const directoryPrefix = entry.fileName.substring(0, i + 1); + index = binarySearchLowerBound( + index + 1, + endIndex, + (index) => !entries[index].fileName.startsWith(directoryPrefix), + ); + } + } + + return { entries: listEntries, directories }; +} + +export class ZipKvStore + implements KvStore +{ + constructor( + public chunkManager: ChunkManager, + public base: BaseFileHandle, + ) {} + + private metadata: ZipMetadata | undefined; + + private async getMetadata(options: Partial) { + let { metadata } = this; + if (metadata === undefined) { + metadata = this.metadata = await getZipMetadata( + this.chunkManager, + this.base, + options, + ); + } + return metadata; + } + + getUrl(key: string) { + return this.base.getUrl() + `|zip:${encodePathForUrl(key)}`; + } + + async stat( + key: string, + options: StatOptions, + ): Promise { + const entry = findEntry(await this.getMetadata(options), key); + if (entry === undefined) return undefined; + return { totalSize: entry.uncompressedSize }; + } + + async read( + key: string, + options: DriverReadOptions, + ): Promise { + const entry = findEntry(await this.getMetadata(options), key); + if (entry === undefined) return undefined; + let { fileDataStart } = entry; + if (fileDataStart === undefined) { + fileDataStart = entry.fileDataStart = await readEntryDataHeader( + makeZipReader(this.base), + entry, + options, + ); + } + let handle: FileHandle = new FileByteRangeHandle(this.base, { + offset: fileDataStart, + length: entry.compressedSize, + }); + switch (entry.compressionMethod) { + case ZipCompressionMethod.STORE: + break; + case ZipCompressionMethod.DEFLATE: + handle = new GzipFileHandle(handle, "deflate-raw"); + break; + default: + throw new Error( + `Unsupported compression method: ${entry.compressionMethod}`, + ); + } + return handle.read(options); + } + + async list( + prefix: string, + options: DriverListOptions, + ): Promise { + const metadata = await this.getMetadata(options); + return list(metadata, prefix); + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/zip/frontend.ts b/src/kvstore/zip/frontend.ts new file mode 100644 index 0000000000..7cdb2a319b --- /dev/null +++ b/src/kvstore/zip/frontend.ts @@ -0,0 +1,40 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { KvStore, KvStoreFileHandle } from "#src/kvstore/index.js"; +import { ProxyKvStore } from "#src/kvstore/proxy.js"; +import { encodePathForUrl } from "#src/kvstore/url.js"; + +export class ZipKvStore extends ProxyKvStore implements KvStore { + constructor( + sharedKvStoreContext: SharedKvStoreContext, + public base: KvStoreFileHandle, + ) { + super(sharedKvStoreContext); + } + + getUrl(key: string) { + return this.base.getUrl() + `|zip:${encodePathForUrl(key)}`; + } + + get supportsOffsetReads() { + return true; + } + get supportsSuffixReads() { + return true; + } +} diff --git a/src/kvstore/zip/index.rst b/src/kvstore/zip/index.rst new file mode 100644 index 0000000000..82b8cb5434 --- /dev/null +++ b/src/kvstore/zip/index.rst @@ -0,0 +1,62 @@ +.. _zip-kvstore: + +ZIP +=== + +The ZIP :ref:`key-value store adapter` provides access to the +entries within a `ZIP archive +`__. + +URL syntax +---------- + +- :file:`{base-kvstore-url}|zip:{path}/{to}/{entry}` + +The :file:`{base-kvstore-url}` must refer to a file, and typically ends with +``.zip``. + +For example: + +- ``gs://bucket/path/to/image.zarr.zip|zip:path/to/array/`` + +.. note:: + + Consistent with normal URL syntax, any special characters in the + :file:`{path}/{to}/{entry}` must be `percent-encoded + `__. + +Capabilities +------------ + +.. list-table:: Supported capabilities + + * - :ref:`kvstore-byte-range-reads` + - General byte ranges supported for STORED (uncompressed) entries. Only + prefix (byte offset of 0) byte range requests supported for DEFLATED + entries. + * - :ref:`kvstore-listing` + - Supported. + +.. list-table:: Required capabilities of base key-value store + + * - :ref:`kvstore-byte-range-reads` + - Required. + * - :ref:`kvstore-listing` + - Not needed. + +Auto detection +-------------- + +ZIP archives are detected automatically based on a signature at the end of the +file, provided that the end of file comment does not exceed 4096 bytes. ZIP +archives with comments up to the maximum length of 65535 bytes are still +supported without auto-detection, however. + +Limitations +----------- + +- Only STORED (uncompressed) and DEFLATED entries are supported. +- Encryption is not supported. +- Entries without a valid Unicode path are ignored. +- Backslashes in paths (e.g. from archives created with certain software on + Windows) are normalized to forward slashes. diff --git a/src/kvstore/zip/metadata.ts b/src/kvstore/zip/metadata.ts new file mode 100644 index 0000000000..dbf864ab05 --- /dev/null +++ b/src/kvstore/zip/metadata.ts @@ -0,0 +1,658 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * Derived from https://github.com/greggman/unzipit/blob/4d94c9b77f7815062ff4460311e8b3ce4f7d5deb/src/unzipit.js + * + * Includes only parsing of raw entries. + * + * @license + * + * The MIT License (MIT) + * + * Copyright (c) 2014 Josh Wolfe + * + * 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. + * + * MIT License + * + * Copyright (c) 2019 Gregg Tavares + * + * 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. + */ + +import { buf as crc32buf } from "crc-32"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; + +export interface ZipEntry { + versionMadeBy: number; + versionNeededToExtract: number; + generalPurposeBitFlag: number; + compressionMethod: number; + lastModFileTime: number; + lastModFileDate: number; + crc32: number; + compressedSize: number; + uncompressedSize: number; + nameBytes: Uint8Array; + commentBytes: Uint8Array; + internalFileAttributes: number; + externalFileAttributes: number; + relativeOffsetOfLocalHeader: number; + fileName: string; +} + +export interface ZipMetadata { + entries: ZipEntry[]; + commentBytes: Uint8Array; + // Estimated size in bytes of metadata. + sizeEstimate: number; +} + +export const EOCDR_WITHOUT_COMMENT_SIZE = 22; +export const MAX_COMMENT_SIZE = 0xffff; // 2-byte size +const EOCDR_SIGNATURE = 0x06054b50; +const ZIP64_EOCDR_SIGNATURE = 0x06064b50; + +export interface Reader { + ( + offset: number, + length: number, + progressOptions: Partial, + ): Promise>; +} + +function lastReadCachingReader(base: Reader) { + let lastReadOffset: number = 0; + let lastReadBuffer: Uint8Array | undefined; + + return async function lastReadCachingRead( + offset: number, + length: number, + progressOptions: Partial, + ): Promise> { + if (lastReadBuffer !== undefined) { + if ( + offset > lastReadOffset && + offset + length <= lastReadOffset + lastReadBuffer.length + ) { + return lastReadBuffer.subarray( + offset - lastReadOffset, + offset + length - lastReadOffset, + ); + } + } + + const newBuffer = await base(offset, length, progressOptions); + lastReadOffset = offset; + lastReadBuffer = newBuffer; + return newBuffer; + }; +} + +export function parseEndOfCentralDirectoryRecord(data: Uint8Array): + | { + eocdrOffset: number; + diskNumber: number; + entryCount: number; + centralDirectorySize: number; + centralDirectoryOffset: number; + } + | undefined { + const dv = new DataView(data.buffer, data.byteOffset, data.byteLength); + const size = data.length; + for (let i = size - EOCDR_WITHOUT_COMMENT_SIZE; i >= 0; --i) { + // 0 - End of central directory signature + if (dv.getUint32(i, /*littleEndian=*/ true) !== EOCDR_SIGNATURE) { + continue; + } + + // 20 - Comment length + const commentLength = dv.getUint16(i + 20, /*littleEndian=*/ true); + const expectedCommentLength = size - i - EOCDR_WITHOUT_COMMENT_SIZE; + if (commentLength !== expectedCommentLength) { + continue; + } + + // 4 - Number of this disk + const diskNumber = dv.getUint16(i + 4, /*littleEndian=*/ true); + + // 6 - Disk where central directory starts + // 8 - Number of central directory records on this disk + // 10 - Total number of central directory records + const entryCount = dv.getUint16(i + 10, /*littleEndian=*/ true); + // 12 - Size of central directory (bytes) + const centralDirectorySize = dv.getUint32(i + 12, /*littleEndian=*/ true); + // 16 - Offset of start of central directory, relative to start of archive + const centralDirectoryOffset = dv.getUint32(i + 16, /*littleEndian=*/ true); + + return { + eocdrOffset: i, + diskNumber, + entryCount, + centralDirectorySize, + centralDirectoryOffset, + }; + } + + return undefined; +} + +async function findEndOfCentralDirectory( + reader: Reader, + totalLength: number, + options: Partial, +) { + const size = Math.min( + EOCDR_WITHOUT_COMMENT_SIZE + MAX_COMMENT_SIZE, + totalLength, + ); + const readStart = totalLength - size; + const data = await reader(readStart, size, options); + const record = parseEndOfCentralDirectoryRecord(data); + if (record === undefined) { + throw new Error( + "End of central directory record signature not found; either not a zip file or file is truncated.", + ); + } + const { + eocdrOffset, + diskNumber, + entryCount, + centralDirectorySize, + centralDirectoryOffset, + } = record; + if (diskNumber !== 0) { + throw new Error( + `Multi-volume zip files are not supported. This is volume: ${diskNumber}`, + ); + } + + // 22 - Comment + // the encoding is always cp437. + const commentBytes = data.slice(eocdrOffset + 22, data.length); + + if (entryCount === 0xffff || centralDirectoryOffset === 0xffffffff) { + return await readZip64CentralDirectory( + reader, + eocdrOffset, + commentBytes, + options, + ); + } else { + return await readEntries( + reader, + centralDirectoryOffset, + centralDirectorySize, + entryCount, + commentBytes, + options, + ); + } +} + +const END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE = 0x07064b50; + +async function readZip64CentralDirectory( + reader: Reader, + offset: number, + commentBytes: Uint8Array, + progressOptions: Partial, +) { + // ZIP64 Zip64 end of central directory locator + const zip64EocdlOffset = offset - 20; + const eocdl = await reader(zip64EocdlOffset, 20, progressOptions); + + const eocdlDv = new DataView( + eocdl.buffer, + eocdl.byteOffset, + eocdl.byteLength, + ); + + // 0 - zip64 end of central dir locator signature + if ( + eocdlDv.getUint32(0, /*littleEndian=*/ true) !== + END_OF_CENTRAL_DIRECTORY_LOCATOR_SIGNATURE + ) { + throw new Error("invalid zip64 end of central directory locator signature"); + } + + // 4 - number of the disk with the start of the zip64 end of central directory + // 8 - relative offset of the zip64 end of central directory record + const zip64EocdrOffset = eocdlDv.getBigUint64(8, /*littleEndian=*/ true); + // 16 - total number of disks + + // ZIP64 end of central directory record + const zip64Eocdr = await reader( + Number(zip64EocdrOffset), + 56, + progressOptions, + ); + + const zip64EocdrDv = new DataView( + zip64Eocdr.buffer, + zip64Eocdr.byteOffset, + zip64Eocdr.byteLength, + ); + + // 0 - zip64 end of central dir signature 4 bytes (0x06064b50) + if ( + zip64EocdrDv.getUint32(0, /*littleEndian=*/ true) !== ZIP64_EOCDR_SIGNATURE + ) { + throw new Error("invalid zip64 end of central directory record signature"); + } + // 4 - size of zip64 end of central directory record 8 bytes + // 12 - version made by 2 bytes + // 14 - version needed to extract 2 bytes + // 16 - number of this disk 4 bytes + // 20 - number of the disk with the start of the central directory 4 bytes + // 24 - total number of entries in the central directory on this disk 8 bytes + // 32 - total number of entries in the central directory 8 bytes + const entryCount = zip64EocdrDv.getBigUint64(32, /*littleEndian=*/ true); + // 40 - size of the central directory 8 bytes + const centralDirectorySize = zip64EocdrDv.getBigUint64( + 40, + /*littleEndian=*/ true, + ); + // 48 - offset of start of central directory with respect to the starting disk number 8 bytes + const centralDirectoryOffset = zip64EocdrDv.getBigUint64( + 48, + /*littleEndian=*/ true, + ); + // 56 - zip64 extensible data sector (variable size) + return readEntries( + reader, + Number(centralDirectoryOffset), + Number(centralDirectorySize), + Number(entryCount), + commentBytes, + progressOptions, + ); +} + +const CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE = 0x02014b50; + +async function readEntries( + reader: Reader, + centralDirectoryOffset: number, + centralDirectorySize: number, + rawEntryCount: number, + commentBytes: Uint8Array, + progressOptions: Partial, +): Promise { + let readEntryCursor = 0; + const allEntriesBuffer = await reader( + centralDirectoryOffset, + centralDirectorySize, + progressOptions, + ); + const rawEntries = []; + + const dv = new DataView( + allEntriesBuffer.buffer, + allEntriesBuffer.byteOffset, + allEntriesBuffer.byteLength, + ); + + const textDecoder = new TextDecoder(); + + for (let e = 0; e < rawEntryCount; ++e) { + // 0 - Central directory file header signature + const signature = dv.getUint32(readEntryCursor + 0, /*littleEndian=*/ true); + if (signature !== CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) { + throw new Error( + `invalid central directory file header signature: 0x${signature.toString(16)}`, + ); + } + // 4 - Version made by + const versionMadeBy = dv.getUint16( + readEntryCursor + 4, + /*littleEndian=*/ true, + ); + // 6 - Version needed to extract (minimum) + const versionNeededToExtract = dv.getUint16( + readEntryCursor + 6, + /*littleEndian=*/ true, + ); + // 8 - General purpose bit flag + const generalPurposeBitFlag = dv.getUint16( + readEntryCursor + 8, + /*littleEndian=*/ true, + ); + // 10 - Compression method + const compressionMethod = dv.getUint16( + readEntryCursor + 10, + /*littleEndian=*/ true, + ); + // 12 - File last modification time + const lastModFileTime = dv.getUint16( + readEntryCursor + 12, + /*littleEndian=*/ true, + ); + // 14 - File last modification date + const lastModFileDate = dv.getUint16( + readEntryCursor + 14, + /*littleEndian=*/ true, + ); + // 16 - CRC-32 + const crc32 = dv.getUint32(readEntryCursor + 16, /*littleEndian=*/ true); + // 20 - Compressed size + let compressedSize = dv.getUint32( + readEntryCursor + 20, + /*littleEndian=*/ true, + ); + // 24 - Uncompressed size + let uncompressedSize = dv.getUint32( + readEntryCursor + 24, + /*littleEndian=*/ true, + ); + // 28 - File name length (n) + const fileNameLength = dv.getUint16( + readEntryCursor + 28, + /*littleEndian=*/ true, + ); + // 30 - Extra field length (m) + const extraFieldLength = dv.getUint16( + readEntryCursor + 30, + /*littleEndian=*/ true, + ); + // 32 - File comment length (k) + const fileCommentLength = dv.getUint16( + readEntryCursor + 32, + /*littleEndian=*/ true, + ); + // 34 - Disk number where file starts + // 36 - Internal file attributes + const internalFileAttributes = dv.getUint16( + readEntryCursor + 36, + /*littleEndian=*/ true, + ); + // 38 - External file attributes + const externalFileAttributes = dv.getUint32( + readEntryCursor + 38, + /*littleEndian=*/ true, + ); + // 42 - Relative offset of local file header + let relativeOffsetOfLocalHeader = dv.getUint32( + readEntryCursor + 42, + /*littleEndian=*/ true, + ); + + if (generalPurposeBitFlag & 0x40) { + throw new Error("strong encryption is not supported"); + } + + readEntryCursor += 46; + + // 46 - File name + let nameBytes = allEntriesBuffer.subarray( + readEntryCursor, + (readEntryCursor += fileNameLength), + ); + + let isUTF8 = (generalPurposeBitFlag & 0x800) !== 0; + + // 46+n - Extra field + const extraFields = []; + for (let i = 0; i < extraFieldLength - 3; ) { + const headerId = dv.getUint16( + readEntryCursor + i + 0, + /*littleEndian=*/ true, + ); + const dataSize = dv.getUint16( + readEntryCursor + i + 2, + /*littleEndian=*/ true, + ); + const dataStart = i + 4; + const dataEnd = dataStart + dataSize; + if (dataEnd > extraFieldLength) { + throw new Error("extra field length exceeds extra field buffer size"); + } + extraFields.push({ + id: headerId, + offset: readEntryCursor + dataStart, + length: dataSize, + }); + i = dataEnd; + } + readEntryCursor += extraFieldLength; + + // 46+n+m - File comment + const commentBytes = allEntriesBuffer.slice( + readEntryCursor, + (readEntryCursor += fileCommentLength), + ); + + if ( + uncompressedSize === 0xffffffff || + compressedSize === 0xffffffff || + relativeOffsetOfLocalHeader === 0xffffffff + ) { + // ZIP64 format + // find the Zip64 Extended Information Extra Field + const zip64ExtraField = extraFields.find((e) => e.id === 0x0001); + if (zip64ExtraField === undefined) { + throw new Error("expected zip64 extended information extra field"); + } + const { offset: zip64EiefBufferOffset, length: zip64EiefBufferLength } = + zip64ExtraField; + let index = 0; + // 0 - Original Size 8 bytes + if (uncompressedSize === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include uncompressed size", + ); + } + uncompressedSize = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 8 - Compressed Size 8 bytes + if (compressedSize === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include compressed size", + ); + } + compressedSize = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 16 - Relative Header Offset 8 bytes + if (relativeOffsetOfLocalHeader === 0xffffffff) { + if (index + 8 > zip64EiefBufferLength) { + throw new Error( + "zip64 extended information extra field does not include relative header offset", + ); + } + relativeOffsetOfLocalHeader = Number( + dv.getBigUint64( + zip64EiefBufferOffset + index, + /*littleEndian=*/ true, + ), + ); + index += 8; + } + // 24 - Disk Start Number 4 bytes + } + + // check for Info-ZIP Unicode Path Extra Field (0x7075) + // see https://github.com/thejoshwolfe/yauzl/issues/33 + const nameField = extraFields.find( + (e) => + e.id === 0x7075 && + e.length >= 6 && // too short to be meaningful + allEntriesBuffer[e.offset] === 1 && // Version 1 byte version of this extra field, currently 1 + dv.getInt32(e.offset + 1, /*littleEndian=*/ true) === + crc32buf(nameBytes), + ); // NameCRC32 4 bytes File Name Field CRC32 Checksum + // > If the CRC check fails, this UTF-8 Path Extra Field should be + // > ignored and the File Name field in the header should be used instead. + if (nameField) { + nameBytes = allEntriesBuffer.slice( + nameField.offset + 5, + nameField.offset + nameField.length, + ); + isUTF8 = true; + } + + // validate file size + if (compressionMethod === 0) { + let expectedCompressedSize = uncompressedSize; + if ((generalPurposeBitFlag & 0x1) !== 0) { + // traditional encryption prefixes the file data with a header + expectedCompressedSize += 12; + } + if (compressedSize !== expectedCompressedSize) { + throw new Error( + `compressed/uncompressed size mismatch for stored file: ${compressedSize} != ${expectedCompressedSize}`, + ); + } + } + + // Just decode as UTF-8 regardless of `isUTF8`, because the non-UTF8 + // encoding is difficult/impossible to determine correctly. + let fileName = textDecoder.decode(nameBytes); + fileName = fileName.replaceAll("\\", "/"); + isUTF8; + + const rawEntry: ZipEntry = { + versionMadeBy, + versionNeededToExtract, + generalPurposeBitFlag, + compressionMethod, + lastModFileTime, + lastModFileDate, + crc32, + compressedSize, + uncompressedSize, + nameBytes, + commentBytes, + internalFileAttributes, + externalFileAttributes, + relativeOffsetOfLocalHeader, + fileName, + }; + rawEntries.push(rawEntry); + } + return { + commentBytes, + entries: rawEntries, + // Estimate that the JavaScript representation consumes twice the memory of + // the encoded representation. + sizeEstimate: commentBytes.length + allEntriesBuffer.length * 2, + }; +} + +export async function readEntryDataHeader( + reader: Reader, + rawEntry: ZipEntry, + options: Partial, +) { + if (rawEntry.generalPurposeBitFlag & 0x1) { + throw new Error("encrypted entries not supported"); + } + const data = await reader(rawEntry.relativeOffsetOfLocalHeader, 30, options); + const dv = new DataView(data.buffer, data.byteOffset, data.byteLength); + + // 0 - Local file header signature = 0x04034b50 + const signature = dv.getUint32(0, /*littleEndian=*/ true); + if (signature !== 0x04034b50) { + throw new Error( + `invalid local file header signature: 0x${signature.toString(16)}`, + ); + } + + // all this should be redundant + // 4 - Version needed to extract (minimum) + // 6 - General purpose bit flag + // 8 - Compression method + // 10 - File last modification time + // 12 - File last modification date + // 14 - CRC-32 + // 18 - Compressed size + // 22 - Uncompressed size + // 26 - File name length (n) + const fileNameLength = dv.getUint16(26, /*littleEndian=*/ true); + // 28 - Extra field length (m) + const extraFieldLength = dv.getUint16(28, /*littleEndian=*/ true); + // 30 - File name + // 30+n - Extra field + const localFileHeaderEnd = + rawEntry.relativeOffsetOfLocalHeader + + data.length + + fileNameLength + + extraFieldLength; + + return localFileHeaderEnd; +} + +export async function readZipMetadata( + reader: Reader, + totalLength: number, + options: Partial, +): Promise { + return await findEndOfCentralDirectory( + lastReadCachingReader(reader), + totalLength, + options, + ); +} + +export enum ZipCompressionMethod { + STORE = 0, + DEFLATE = 8, +} diff --git a/src/kvstore/zip/register_backend.ts b/src/kvstore/zip/register_backend.ts new file mode 100644 index 0000000000..e90a4eed17 --- /dev/null +++ b/src/kvstore/zip/register_backend.ts @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { backendOnlyKvStoreProviderRegistry } from "#src/kvstore/backend.js"; +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; +import { ZipKvStore } from "#src/kvstore/zip/backend.js"; + +function zipProvider( + sharedKvStoreContext: SharedKvStoreContextCounterpart, +): KvStoreAdapterProvider { + return { + scheme: "zip", + description: "ZIP archive", + getKvStore(parsedUrl, base) { + ensureNoQueryOrFragmentParameters(parsedUrl); + return { + store: new ZipKvStore( + sharedKvStoreContext.chunkManager, + new KvStoreFileHandle(base.store, base.path), + ), + path: decodeURIComponent(parsedUrl.suffix ?? ""), + }; + }, + }; +} + +backendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider(zipProvider); diff --git a/src/kvstore/zip/register_frontend.ts b/src/kvstore/zip/register_frontend.ts new file mode 100644 index 0000000000..ff47de0d26 --- /dev/null +++ b/src/kvstore/zip/register_frontend.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { KvStoreAdapterProvider } from "#src/kvstore/context.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { frontendOnlyKvStoreProviderRegistry } from "#src/kvstore/frontend.js"; +import { KvStoreFileHandle } from "#src/kvstore/index.js"; +import { ensureNoQueryOrFragmentParameters } from "#src/kvstore/url.js"; +import { registerAutoDetect } from "#src/kvstore/zip/auto_detect.js"; +import { ZipKvStore } from "#src/kvstore/zip/frontend.js"; + +function zipProvider( + sharedKvStoreContext: SharedKvStoreContext, +): KvStoreAdapterProvider { + return { + scheme: "zip", + description: "ZIP archive", + getKvStore(parsedUrl, base) { + ensureNoQueryOrFragmentParameters(parsedUrl); + return { + store: new ZipKvStore( + sharedKvStoreContext, + new KvStoreFileHandle(base.store, base.path), + ), + path: decodeURIComponent(parsedUrl.suffix ?? ""), + }; + }, + }; +} + +frontendOnlyKvStoreProviderRegistry.registerKvStoreAdapterProvider(zipProvider); + +registerAutoDetect(frontendOnlyKvStoreProviderRegistry.autoDetectRegistry); diff --git a/src/layer/annotation/index.ts b/src/layer/annotation/index.ts index 35c1a4e430..663b76e052 100644 --- a/src/layer/annotation/index.ts +++ b/src/layer/annotation/index.ts @@ -29,7 +29,7 @@ import { import type { CoordinateTransformSpecification } from "#src/coordinate_transform.js"; import { makeCoordinateSpace } from "#src/coordinate_transform.js"; import type { DataSourceSpecification } from "#src/datasource/index.js"; -import { localAnnotationsUrl, LocalDataSource } from "#src/datasource/index.js"; +import { localAnnotationsUrl, LocalDataSource } from "#src/datasource/local.js"; import type { LayerManager, ManagedUserLayer } from "#src/layer/index.js"; import { LayerReference, @@ -726,19 +726,21 @@ function makeShaderCodeWidget(layer: AnnotationUserLayer) { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: AnnotationUserLayer) { super(); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); this.content.appendChild(this.codeWidget.element); this.codeWidget.textEditor.refresh(); } } class RenderingOptionsTab extends Tab { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: AnnotationUserLayer) { super(); const { element } = this; + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); element.classList.add("neuroglancer-annotation-rendering-tab"); element.appendChild( this.registerDisposer( diff --git a/src/layer/image/index.ts b/src/layer/image/index.ts index 256050060c..2d2830f6c3 100644 --- a/src/layer/image/index.ts +++ b/src/layer/image/index.ts @@ -196,7 +196,7 @@ export class ImageUserLayer extends Base { }; } - selectionState: ImageLayerSelectionState; + declare selectionState: ImageLayerSelectionState; constructor(managedLayer: Borrowed) { super(managedLayer); @@ -521,10 +521,11 @@ for (const control of LAYER_CONTROLS) { } class RenderingOptionsTab extends Tab { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: ImageUserLayer) { super(); const { element } = this; + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); element.classList.add("neuroglancer-image-dropdown"); for (const control of LAYER_CONTROLS) { @@ -579,9 +580,10 @@ class RenderingOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: ImageUserLayer) { super(); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); this.content.classList.add("neuroglancer-image-layer-shader-overlay"); this.content.appendChild(this.codeWidget.element); this.codeWidget.textEditor.refresh(); diff --git a/src/layer/index.ts b/src/layer/index.ts index 9a8e6d8dbe..fea87063da 100644 --- a/src/layer/index.ts +++ b/src/layer/index.ts @@ -32,7 +32,7 @@ import { TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; import type { - DataSourceProviderRegistry, + DataSourceRegistry, DataSourceSpecification, DataSubsource, } from "#src/datasource/index.js"; @@ -80,7 +80,7 @@ import { TrackableSidePanelLocation, } from "#src/ui/side_panel_location.js"; import type { GlobalToolBinder } from "#src/ui/tool.js"; -import { LocalToolBinder, SelectedLegacyTool } from "#src/ui/tool.js"; +import { LayerToolBinder, SelectedLegacyTool } from "#src/ui/tool.js"; import { gatherUpdate } from "#src/util/array.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; @@ -349,9 +349,7 @@ export class UserLayer extends RefCounted { tabs = this.registerDisposer(new TabSpecification()); panels = new UserLayerSidePanelsState(this); tool = this.registerDisposer(new SelectedLegacyTool(this)); - toolBinder = this.registerDisposer( - new LocalToolBinder(this, this.manager.root.toolBinder), - ); + toolBinder: LayerToolBinder; dataSourcesChanged = new NullarySignal(); dataSources: LayerDataSource[] = []; @@ -362,6 +360,9 @@ export class UserLayer extends RefCounted { constructor(public managedLayer: Borrowed) { super(); + this.toolBinder = this.registerDisposer( + new LayerToolBinder(this, this.manager.root.toolBinder), + ); this.localCoordinateSpaceCombiner.includeDimensionPredicate = isLocalOrChannelDimension; this.tabs.changed.add(this.specificationChanged.dispatch); @@ -1246,8 +1247,7 @@ const DATA_SELECTION_STATE_DEFAULT_PANEL_LOCATION_VISIBLE = { export class TrackableDataSelectionState extends RefCounted - implements - TrackableValueInterface + implements TrackableValueInterface { changed = new NullarySignal(); history: PersistentViewerSelectionState[] = []; @@ -2080,7 +2080,7 @@ export abstract class LayerListSpecification extends RefCounted { abstract rpc: RPC; - abstract dataSourceProviderRegistry: Borrowed; + abstract dataSourceProviderRegistry: Borrowed; abstract layerManager: Borrowed; abstract chunkManager: Borrowed; abstract layerSelectedValues: Borrowed; @@ -2104,17 +2104,13 @@ export class TopLevelLayerListSpecification extends LayerListSpecification { return this; } - coordinateSpaceCombiner = new CoordinateSpaceCombiner( - this.coordinateSpace, - isGlobalDimension, - ); + coordinateSpaceCombiner: CoordinateSpaceCombiner; subsets = new Set(); - - layerSelectedValues = this.selectionState.layerSelectedValues; + layerSelectedValues: LayerSelectedValues; constructor( public display: DisplayContext, - public dataSourceProviderRegistry: DataSourceProviderRegistry, + public dataSourceProviderRegistry: DataSourceRegistry, public layerManager: LayerManager, public chunkManager: ChunkManager, public selectionState: Borrowed, @@ -2124,6 +2120,11 @@ export class TopLevelLayerListSpecification extends LayerListSpecification { public toolBinder: Borrowed, ) { super(); + this.coordinateSpaceCombiner = new CoordinateSpaceCombiner( + coordinateSpace, + isGlobalDimension, + ); + this.layerSelectedValues = selectionState.layerSelectedValues; this.registerDisposer( layerManager.layersChanged.add(this.changed.dispatch), ); diff --git a/src/layer/layer_data_source.ts b/src/layer/layer_data_source.ts index 41cbacdd5d..63d07a7746 100644 --- a/src/layer/layer_data_source.ts +++ b/src/layer/layer_data_source.ts @@ -28,6 +28,7 @@ import { import type { DataSource, DataSourceSpecification, + DataSourceWithRedirectInfo, DataSubsourceEntry, DataSubsourceSpecification, } from "#src/datasource/index.js"; @@ -37,9 +38,9 @@ import { getWatchableRenderLayerTransform } from "#src/render_coordinate_transfo import type { RenderLayer } from "#src/renderlayer.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; import { arraysEqual } from "#src/util/array.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { disposableOnce, RefCounted } from "#src/util/disposable.js"; +import { formatErrorMessage } from "#src/util/error.js"; import { verifyBoolean, verifyObject, @@ -50,6 +51,7 @@ import { } from "#src/util/json.js"; import * as matrix from "#src/util/matrix.js"; import { MessageList, MessageSeverity } from "#src/util/message_list.js"; +import { MultiConsumerProgressListener } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; export function parseDataSubsourceSpecificationFromJson( @@ -309,6 +311,7 @@ export type LayerDataSourceLoadState = export class LayerDataSource extends RefCounted { changed = new NullarySignal(); messages = new MessageList(); + progressListener = new MultiConsumerProgressListener(); private loadState_: LayerDataSourceLoadState = undefined; private spec_: DataSourceSpecification; private specGeneration = -1; @@ -397,23 +400,18 @@ export class LayerDataSource extends RefCounted { } this.refCounted_ = refCounted; this.spec_ = spec; - const chunkManager = layer.manager.chunkManager; const registry = layer.manager.dataSourceProviderRegistry; - const cancellationToken = new CancellationTokenSource(); - this.messages.addMessage({ - severity: MessageSeverity.info, - message: "Loading data source", - }); + const abortController = new AbortController(); registry .get({ - chunkManager, url: spec.url, - cancellationToken, + signal: abortController.signal, globalCoordinateSpace: layer.manager.root.coordinateSpace, transform: spec.transform, state: spec.state, + progressListener: this.progressListener, }) - .then((source: DataSource) => { + .then((source: DataSourceWithRedirectInfo) => { if (refCounted.wasDisposed) return; this.messages.clearMessages(); const loaded = refCounted.registerDisposer( @@ -438,20 +436,29 @@ export class LayerDataSource extends RefCounted { }), ); } + const { originalCanonicalUrl } = source; + const layerType = this.layer.type; + if ( + (layerType === "auto" || layerType === "new" || spec.setManually) && + originalCanonicalUrl !== undefined && + originalCanonicalUrl !== spec.url + ) { + this.spec = { ...spec, url: originalCanonicalUrl }; + } retainer(); }) - .catch((error: Error) => { - if (this.wasDisposed) return; + .catch((error) => { + if (refCounted.wasDisposed) return; this.loadState_ = { error }; this.messages.clearMessages(); this.messages.addMessage({ severity: MessageSeverity.error, - message: error.message, + message: formatErrorMessage(error), }); this.changed.dispatch(); }); refCounted.registerDisposer(() => { - cancellationToken.cancel(); + abortController.abort(); }); this.changed.dispatch(); } diff --git a/src/layer/segmentation/index.ts b/src/layer/segmentation/index.ts index 8a5981d87c..8551e8c576 100644 --- a/src/layer/segmentation/index.ts +++ b/src/layer/segmentation/index.ts @@ -22,7 +22,7 @@ import type { DataSourceSpecification } from "#src/datasource/index.js"; import { LocalDataSource, localEquivalencesUrl, -} from "#src/datasource/index.js"; +} from "#src/datasource/local.js"; import type { LayerActionContext, ManagedUserLayer } from "#src/layer/index.js"; import { LinkedLayerGroup, @@ -142,7 +142,40 @@ export class SegmentationUserLayerGroupState this.hideSegmentZero.changed.add(specificationChanged.dispatch); this.segmentQuery.changed.add(specificationChanged.dispatch); - const { visibleSegments, selectedSegments } = this; + const { selectedSegments } = this; + const visibleSegments = (this.visibleSegments = this.registerDisposer( + Uint64Set.makeWithCounterpart(layer.manager.rpc), + )); + this.segmentEquivalences = this.registerDisposer( + SharedDisjointUint64Sets.makeWithCounterpart( + layer.manager.rpc, + layer.registerDisposer( + makeCachedDerivedWatchableValue( + (x) => + x?.visibleSegmentEquivalencePolicy || + VisibleSegmentEquivalencePolicy.MIN_REPRESENTATIVE, + [this.graph], + ), + ), + ), + ); + + this.temporaryVisibleSegments = layer.registerDisposer( + Uint64Set.makeWithCounterpart(layer.manager.rpc), + ); + this.temporarySegmentEquivalences = layer.registerDisposer( + SharedDisjointUint64Sets.makeWithCounterpart( + layer.manager.rpc, + this.segmentEquivalences.disjointSets.visibleSegmentEquivalencePolicy, + ), + ); + this.useTemporaryVisibleSegments = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + this.useTemporarySegmentEquivalences = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + visibleSegments.changed.add(specificationChanged.dispatch); selectedSegments.changed.add(specificationChanged.dispatch); selectedSegments.changed.add((x, add) => { @@ -235,48 +268,23 @@ export class SegmentationUserLayerGroupState } localGraph = new LocalSegmentationGraphSource(); - visibleSegments = this.registerDisposer( - Uint64Set.makeWithCounterpart(this.layer.manager.rpc), - ); + visibleSegments: Uint64Set; selectedSegments = this.registerDisposer(new Uint64OrderedSet()); segmentPropertyMap = new WatchableValue< PreprocessedSegmentPropertyMap | undefined >(undefined); graph = new WatchableValue(undefined); - segmentEquivalences = this.registerDisposer( - SharedDisjointUint64Sets.makeWithCounterpart( - this.layer.manager.rpc, - this.layer.registerDisposer( - makeCachedDerivedWatchableValue( - (x) => - x?.visibleSegmentEquivalencePolicy || - VisibleSegmentEquivalencePolicy.MIN_REPRESENTATIVE, - [this.graph], - ), - ), - ), - ); + segmentEquivalences: SharedDisjointUint64Sets; localSegmentEquivalences = false; maxIdLength = new WatchableValue(1); hideSegmentZero = new TrackableBoolean(true, true); segmentQuery = new TrackableValue("", verifyString); - temporaryVisibleSegments = this.layer.registerDisposer( - Uint64Set.makeWithCounterpart(this.layer.manager.rpc), - ); - temporarySegmentEquivalences = this.layer.registerDisposer( - SharedDisjointUint64Sets.makeWithCounterpart( - this.layer.manager.rpc, - this.segmentEquivalences.disjointSets.visibleSegmentEquivalencePolicy, - ), - ); - useTemporaryVisibleSegments = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); - useTemporarySegmentEquivalences = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); + temporaryVisibleSegments: Uint64Set; + temporarySegmentEquivalences: SharedDisjointUint64Sets; + useTemporaryVisibleSegments: SharedWatchableValue; + useTemporarySegmentEquivalences: SharedWatchableValue; } export class SegmentationUserLayerColorGroupState @@ -403,6 +411,41 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { // Even though `SegmentationUserLayer` assigns this to its `displayState` property, redundantly // assign it here first in order to allow it to be accessed by `segmentationGroupState`. layer.displayState = this; + + this.linkedSegmentationGroup = layer.registerDisposer( + new LinkedLayerGroup( + layer.manager.rootLayers, + layer, + (userLayer) => userLayer instanceof SegmentationUserLayer, + (userLayer: SegmentationUserLayer) => + userLayer.displayState.linkedSegmentationGroup, + ), + ); + + this.linkedSegmentationColorGroup = this.layer.registerDisposer( + new LinkedLayerGroup( + layer.manager.rootLayers, + layer, + (userLayer) => userLayer instanceof SegmentationUserLayer, + (userLayer: SegmentationUserLayer) => + userLayer.displayState.linkedSegmentationColorGroup, + ), + ); + + this.originalSegmentationGroupState = layer.registerDisposer( + new SegmentationUserLayerGroupState(layer), + ); + + this.originalSegmentationColorGroupState = layer.registerDisposer( + new SegmentationUserLayerColorGroupState(layer), + ); + + this.transparentPickEnabled = layer.pick; + + this.useTempSegmentStatedColors2d = layer.registerDisposer( + SharedWatchableValue.make(layer.manager.rpc, false), + ); + this.segmentationGroupState = this.layer.registerDisposer( new LinkedSegmentationGroupState( this.linkedSegmentationGroup, @@ -416,6 +459,9 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { ), ); + this.selectSegment = layer.selectSegment; + this.filterBySegmentLabel = layer.filterBySegmentLabel; + this.hideSegmentZero = this.layer.registerDisposer( new IndirectWatchableValue( this.segmentationGroupState, @@ -488,47 +534,22 @@ class SegmentationUserLayerDisplayState implements SegmentationDisplayState { shaderError = makeWatchableShaderError(); renderScaleHistogram = new RenderScaleHistogram(); renderScaleTarget = trackableRenderScaleTarget(1); - selectSegment = this.layer.selectSegment; - transparentPickEnabled = this.layer.pick; + selectSegment: (id: Uint64, pin: boolean | "toggle") => void; + transparentPickEnabled: TrackableBoolean; baseSegmentColoring = new TrackableBoolean(false, false); baseSegmentHighlighting = new TrackableBoolean(false, false); - useTempSegmentStatedColors2d = this.layer.registerDisposer( - SharedWatchableValue.make(this.layer.manager.rpc, false), - ); + useTempSegmentStatedColors2d: SharedWatchableValue; - filterBySegmentLabel = this.layer.filterBySegmentLabel; + filterBySegmentLabel: (id: Uint64) => void; moveToSegment = (id: Uint64) => { this.layer.moveToSegment(id); }; - linkedSegmentationGroup: LinkedLayerGroup = this.layer.registerDisposer( - new LinkedLayerGroup( - this.layer.manager.rootLayers, - this.layer, - (userLayer) => userLayer instanceof SegmentationUserLayer, - (userLayer: SegmentationUserLayer) => - userLayer.displayState.linkedSegmentationGroup, - ), - ); - - linkedSegmentationColorGroup: LinkedLayerGroup = this.layer.registerDisposer( - new LinkedLayerGroup( - this.layer.manager.rootLayers, - this.layer, - (userLayer) => userLayer instanceof SegmentationUserLayer, - (userLayer: SegmentationUserLayer) => - userLayer.displayState.linkedSegmentationColorGroup, - ), - ); - - originalSegmentationGroupState = this.layer.registerDisposer( - new SegmentationUserLayerGroupState(this.layer), - ); - - originalSegmentationColorGroupState = this.layer.registerDisposer( - new SegmentationUserLayerColorGroupState(this.layer), - ); + linkedSegmentationGroup: LinkedLayerGroup; + linkedSegmentationColorGroup: LinkedLayerGroup; + originalSegmentationGroupState: SegmentationUserLayerGroupState; + originalSegmentationColorGroupState: SegmentationUserLayerColorGroupState; segmentationGroupState: WatchableValueInterface; segmentationColorGroupState: WatchableValueInterface; diff --git a/src/layer/single_mesh/index.ts b/src/layer/single_mesh/index.ts index 6e2b686943..693b849137 100644 --- a/src/layer/single_mesh/index.ts +++ b/src/layer/single_mesh/index.ts @@ -120,7 +120,7 @@ export class SingleMeshUserLayer extends UserLayer { } static type = "mesh"; - static typeAbbreviation = "mesh"; + static typeAbbreviation = "msh"; } function makeShaderCodeWidget(layer: SingleMeshUserLayer) { @@ -193,13 +193,16 @@ function makeVertexAttributeWidget(layer: SingleMeshUserLayer) { } class DisplayOptionsTab extends Tab { - attributeWidget = this.registerDisposer( - makeVertexAttributeWidget(this.layer), - ); - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + attributeWidget: VertexAttributeWidget; + codeWidget: ShaderCodeWidget; + constructor(public layer: SingleMeshUserLayer) { super(); const { element } = this; + this.attributeWidget = this.registerDisposer( + makeVertexAttributeWidget(layer), + ); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(layer)); element.classList.add("neuroglancer-single-mesh-dropdown"); const topRow = document.createElement("div"); topRow.className = "neuroglancer-single-mesh-dropdown-top-row"; @@ -239,12 +242,14 @@ class DisplayOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - attributeWidget = this.registerDisposer( - makeVertexAttributeWidget(this.layer), - ); - codeWidget = this.registerDisposer(makeShaderCodeWidget(this.layer)); + attributeWidget: VertexAttributeWidget; + codeWidget: ShaderCodeWidget; constructor(public layer: SingleMeshUserLayer) { super(); + this.attributeWidget = this.registerDisposer( + makeVertexAttributeWidget(layer), + ); + this.codeWidget = this.registerDisposer(makeShaderCodeWidget(layer)); this.content.classList.add("neuroglancer-single-mesh-layer-shader-overlay"); this.content.appendChild(this.attributeWidget.element); this.content.appendChild(this.codeWidget.element); diff --git a/src/layer_group_viewer.ts b/src/layer_group_viewer.ts index dfca69cc08..afae67a2c5 100644 --- a/src/layer_group_viewer.ts +++ b/src/layer_group_viewer.ts @@ -60,11 +60,7 @@ import { registerNested } from "#src/trackable_value.js"; import { ContextMenu } from "#src/ui/context_menu.js"; import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; import { LayerBar } from "#src/ui/layer_bar.js"; -import { - endLayerDrag, - getDropEffectFromModifiers, - startLayerDrag, -} from "#src/ui/layer_drag_and_drop.js"; +import { endLayerDrag, startLayerDrag } from "#src/ui/layer_drag_and_drop.js"; import { setupPositionDropHandlers } from "#src/ui/position_drag_and_drop.js"; import { LocalToolBinder } from "#src/ui/tool.js"; import { AutomaticallyFocusedElement } from "#src/util/automatic_focus.js"; @@ -72,6 +68,7 @@ import type { TrackableRGB } from "#src/util/color.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeChildren } from "#src/util/dom.js"; +import { getDropEffectFromModifiers } from "#src/util/drag_and_drop.js"; import { dispatchEventAction, registerActionListener, @@ -567,7 +564,7 @@ export class LayerGroupViewer extends RefCounted { if (layout !== "3d") { newLayout = `${layout}-3d`; } else { - newLayout = "4panel"; + newLayout = "4panel-alt"; } } else { newLayout = layout; @@ -581,6 +578,7 @@ export class LayerGroupViewer extends RefCounted { const layerPanelElement = layerPanel.element; layerPanelElement.addEventListener("dragstart", (event: DragEvent) => { pushDragStatus( + event, layerPanel.element, "drag", "Drag layer group to the left/top/right/bottom edge of a layer group, or to another layer bar/panel (including in another Neuroglancer window)", @@ -606,8 +604,8 @@ export class LayerGroupViewer extends RefCounted { layerPanel.element.style.backgroundColor = ""; }, 0); }); - layerPanel.element.addEventListener("dragend", () => { - popDragStatus(layerPanelElement, "drag"); + layerPanel.element.addEventListener("dragend", (event: DragEvent) => { + popDragStatus(event, layerPanelElement, "drag"); endLayerDrag(); if (dragSource !== undefined && dragSource.viewer === this) { dragSource.disposer(); diff --git a/src/layer_groups_layout.ts b/src/layer_groups_layout.ts index 851b3ff275..bfcd190e89 100644 --- a/src/layer_groups_layout.ts +++ b/src/layer_groups_layout.ts @@ -475,8 +475,8 @@ function setupDropZone( } dropZone.classList.add("neuroglancer-drag-over"); }); - dropZone.addEventListener("dragleave", () => { - popDragStatus(dropZone, "drop"); + dropZone.addEventListener("dragleave", (event) => { + popDragStatus(event, dropZone, "drop"); dropZone.classList.remove("neuroglancer-drag-over"); }); dropZone.addEventListener("dragover", (event: DragEvent) => { @@ -485,7 +485,7 @@ function setupDropZone( message: string, ) => { if (info.dropEffectMessage) message += ` (${info.dropEffectMessage})`; - pushDragStatus(dropZone, "drop", message); + pushDragStatus(event, dropZone, "drop", message); event.stopPropagation(); event.preventDefault(); }; @@ -511,14 +511,14 @@ function setupDropZone( }); dropZone.addEventListener("drop", (event: DragEvent) => { dropZone.classList.remove("neuroglancer-drag-over"); - popDragStatus(dropZone, "drop"); + popDragStatus(event, dropZone, "drop"); let dropLayers: DropLayers | undefined; let layoutSpec: any; if (hasViewerDrag(event)) { event.stopPropagation(); try { layoutSpec = JSON.parse(event.dataTransfer!.getData(viewerDragType)); - } catch (e) { + } catch { return; } dropLayers = getDropLayers(event, manager, { @@ -606,6 +606,7 @@ export class StackLayoutComponent event.preventDefault(); const updateMessage = () => { pushDragStatus( + event, dropZone, "drag", `Drag to resize, current ${ @@ -640,8 +641,8 @@ export class StackLayoutComponent Math.round((1 - firstFraction) * existingFlexSum * 100) / 100; updateMessage(); }, - () => { - popDragStatus(dropZone, "drag"); + (event) => { + popDragStatus(event, dropZone, "drag"); }, ); }); @@ -781,13 +782,7 @@ function makeComponent(container: LayoutComponentContainer, spec: any) { } export class RootLayoutContainer extends RefCounted implements Trackable { - container = this.registerDisposer( - new LayoutComponentContainer( - this.viewer, - this.defaultSpecification, - undefined, - ), - ); + container: LayoutComponentContainer; get changed() { return this.container.changed; @@ -802,6 +797,9 @@ export class RootLayoutContainer extends RefCounted implements Trackable { public defaultSpecification: any, ) { super(); + this.container = this.registerDisposer( + new LayoutComponentContainer(viewer, defaultSpecification, undefined), + ); } reset() { diff --git a/src/main.bundle.js b/src/main.bundle.js index 617f992b08..2cc375487b 100644 --- a/src/main.bundle.js +++ b/src/main.bundle.js @@ -1,3 +1,5 @@ +import "#src/util/polyfills.js"; import "#src/layer/enabled_frontend_modules.js"; import "#src/datasource/enabled_frontend_modules.js"; +import "#src/kvstore/enabled_frontend_modules.js"; import "#main"; diff --git a/src/main_module.ts b/src/main_module.ts index b232673900..79af4f9d24 100644 --- a/src/main_module.ts +++ b/src/main_module.ts @@ -1,2 +1,4 @@ +import "#src/util/polyfills.js"; import "#src/layer/enabled_frontend_modules.js"; import "#src/datasource/enabled_frontend_modules.js"; +import "#src/kvstore/enabled_frontend_modules.js"; diff --git a/src/main_python.ts b/src/main_python.ts index 64bf3075a7..8357627dd5 100644 --- a/src/main_python.ts +++ b/src/main_python.ts @@ -21,8 +21,7 @@ import { debounce } from "lodash-es"; import { CachingCredentialsManager } from "#src/credentials_provider/index.js"; -import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; -import { PythonDataSource } from "#src/datasource/python/frontend.js"; +import type { PythonDataSource } from "#src/datasource/python/frontend.js"; import { Client, ClientStateReceiver, @@ -114,21 +113,19 @@ const client = new Client(); const credentialsManager = new PythonCredentialsManager(client); -const dataSourceProvider = getDefaultDataSourceProvider({ +const viewer = ((window).viewer = makeDefaultViewer({ + showLayerDialog: false, + resetStateWhenEmpty: false, credentialsManager: new CachingCredentialsManager(credentialsManager), -}); -const pythonDataSource = new PythonDataSource(); -dataSourceProvider.register("python", pythonDataSource); +})); + +const pythonDataSource = viewer.dataSourceProvider.dataSources.get( + "python", +) as PythonDataSource; configState.add( "sourceGenerations", makeTrackableBasedSourceGenerationHandler(pythonDataSource), ); - -const viewer = ((window).viewer = makeDefaultViewer({ - showLayerDialog: false, - resetStateWhenEmpty: false, - dataSourceProvider, -})); setDefaultInputEventBindings(viewer.inputEventBindings); configState.add( "inputEventBindings", @@ -151,7 +148,10 @@ let sharedState: Trackable | undefined = viewer.state; if (window.location.hash) { const hashBinding = viewer.registerDisposer( - new UrlHashBinding(viewer.state, credentialsManager), + new UrlHashBinding( + viewer.state, + viewer.dataSourceProvider.sharedKvStoreContext, + ), ); hashBinding.updateFromUrlHash(); sharedState = undefined; @@ -159,7 +159,7 @@ if (window.location.hash) { const prefetchManager = new PrefetchManager( viewer.display, - dataSourceProvider, + viewer.dataSourceProvider, viewer.dataContext.addRef(), viewer.uiConfiguration, ); diff --git a/src/mesh/backend.ts b/src/mesh/backend.ts index ca5f313915..fe8191a1b5 100644 --- a/src/mesh/backend.ts +++ b/src/mesh/backend.ts @@ -45,7 +45,6 @@ import { getObjectKey, forEachVisibleSegment, } from "#src/segmentation_display_state/base.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import type { Endianness } from "#src/util/endian.js"; import { convertEndian32 } from "#src/util/endian.js"; import { getFrustrumPlanes, mat4, vec3 } from "#src/util/geom.js"; @@ -370,10 +369,7 @@ export function decodeTriangleVertexPositionsAndIndices( export interface MeshSource { // TODO(jbms): Move this declaration to class definition below and declare abstract once // TypeScript supports mixins with abstract classes. - downloadFragment( - chunk: FragmentChunk, - cancellationToken: CancellationToken, - ): Promise; + downloadFragment(chunk: FragmentChunk, signal: AbortSignal): Promise; } // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging @@ -424,8 +420,8 @@ export class MeshSource extends ChunkSource { @registerSharedObject(FRAGMENT_SOURCE_RPC_ID) export class FragmentSource extends ChunkSource { meshSource: MeshSource | null = null; - download(chunk: FragmentChunk, cancellationToken: CancellationToken) { - return this.meshSource!.downloadFragment(chunk, cancellationToken); + download(chunk: FragmentChunk, signal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, signal); } } @@ -570,7 +566,7 @@ export interface MultiscaleMeshSource { // TypeScript supports mixins with abstract classes. downloadFragment( chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise; } @@ -622,11 +618,8 @@ export class MultiscaleMeshSource extends ChunkSource { @registerSharedObject(MULTISCALE_FRAGMENT_SOURCE_RPC_ID) export class MultiscaleFragmentSource extends ChunkSource { meshSource: MultiscaleMeshSource | null = null; - download( - chunk: MultiscaleFragmentChunk, - cancellationToken: CancellationToken, - ) { - return this.meshSource!.downloadFragment(chunk, cancellationToken); + download(chunk: MultiscaleFragmentChunk, signal: AbortSignal) { + return this.meshSource!.downloadFragment(chunk, signal); } } diff --git a/src/mesh/frontend.ts b/src/mesh/frontend.ts index 042ae4553e..bccb3c9ec6 100644 --- a/src/mesh/frontend.ts +++ b/src/mesh/frontend.ts @@ -67,7 +67,7 @@ import { } from "#src/util/geom.js"; import * as matrix from "#src/util/matrix.js"; import type { Uint64 } from "#src/util/uint64.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import { parameterizedEmitterDependentShaderGetter } from "#src/webgl/dynamic_shader.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; @@ -86,19 +86,19 @@ function copyMeshDataToGpu( gl: GL, chunk: FragmentChunk | MultiscaleFragmentChunk, ) { - chunk.vertexBuffer = Buffer.fromData( + chunk.vertexBuffer = GLBuffer.fromData( gl, chunk.meshData.vertexPositions, gl.ARRAY_BUFFER, gl.STATIC_DRAW, ); - chunk.indexBuffer = Buffer.fromData( + chunk.indexBuffer = GLBuffer.fromData( gl, chunk.meshData.indices, gl.ELEMENT_ARRAY_BUFFER, gl.STATIC_DRAW, ); - chunk.normalBuffer = Buffer.fromData( + chunk.normalBuffer = GLBuffer.fromData( gl, chunk.meshData.vertexNormals, gl.ARRAY_BUFFER, @@ -240,12 +240,13 @@ highp vec3 getVertexPosition() { export class MeshShaderManager { private tempLightVec = new Float32Array(4); - private vertexPositionHandler = - vertexPositionHandlers[this.vertexPositionFormat]; + private vertexPositionHandler: VertexPositionFormatHandler; constructor( public fragmentRelativeVertices: boolean, public vertexPositionFormat: VertexPositionFormat, - ) {} + ) { + this.vertexPositionHandler = vertexPositionHandlers[vertexPositionFormat]; + } beginLayer( gl: GL, @@ -412,11 +413,8 @@ export interface MeshDisplayState extends SegmentationDisplayState3D { } export class MeshLayer extends PerspectiveViewRenderLayer { - protected meshShaderManager = new MeshShaderManager( - /*fragmentRelativeVertices=*/ false, - VertexPositionFormat.float32, - ); - private getShader = this.meshShaderManager.makeGetter(this); + protected meshShaderManager; + private getShader; backend: SegmentationLayerSharedObject; constructor( @@ -425,6 +423,11 @@ export class MeshLayer extends PerspectiveViewRenderLayer; + declare chunks: Map; initializeCounterpart(rpc: RPC, options: any) { this.fragmentSource.initializeCounterpart(this.chunkManager.rpc!, {}); @@ -721,7 +724,7 @@ export class MeshSource extends ChunkSource { @registerSharedObjectOwner(FRAGMENT_SOURCE_RPC_ID) export class FragmentSource extends ChunkSource { - chunks: Map; + declare chunks: Map; get key() { return this.meshSource.key; } @@ -751,11 +754,8 @@ function hasFragmentChunk( } export class MultiscaleMeshLayer extends PerspectiveViewRenderLayer { - protected meshShaderManager = new MeshShaderManager( - /*fragmentRelativeVertices=*/ this.source.format.fragmentRelativeVertices, - this.source.format.vertexPositionFormat, - ); - private getShader = this.meshShaderManager.makeGetter(this); + protected meshShaderManager: MeshShaderManager; + private getShader; backend: SegmentationLayerSharedObject; constructor( @@ -764,6 +764,11 @@ export class MultiscaleMeshLayer extends PerspectiveViewRenderLayer; + declare chunks: Map; format: MultiscaleFragmentFormat; constructor( chunkManager: Borrowed, @@ -1150,7 +1155,7 @@ export class MultiscaleMeshSource extends ChunkSource { @registerSharedObjectOwner(MULTISCALE_FRAGMENT_SOURCE_RPC_ID) export class MultiscaleFragmentSource extends ChunkSource { - chunks: Map; + declare chunks: Map; get key() { return this.meshSource.key; } diff --git a/src/navigation_state.ts b/src/navigation_state.ts index 2f12c550fc..f9adcfd613 100644 --- a/src/navigation_state.ts +++ b/src/navigation_state.ts @@ -491,11 +491,12 @@ export class CoordinateSpacePlaybackVelocity extends RefCounted { velocities[index] = newVelocity; this.changed.dispatch(); }; - const prevVelocity = getVelocity(); + let prevVelocity = getVelocity(); owner.registerDisposer( this.changed.add(() => { const curVelocity = getVelocity(); if (curVelocity !== prevVelocity) { + prevVelocity = curVelocity; changed.dispatch(); } }), @@ -674,15 +675,17 @@ export class CoordinateSpacePlaybackVelocity extends RefCounted { export class LinkedCoordinateSpacePlaybackVelocity extends RefCounted { changed = new NullarySignal(); - velocity = this.registerDisposer( - new CoordinateSpacePlaybackVelocity(this.peer.coordinateSpace), - ); + velocity: CoordinateSpacePlaybackVelocity; constructor( public peer: Owned, public positionLink: TrackableLinkInterface, ) { super(); + this.velocity = this.registerDisposer( + new CoordinateSpacePlaybackVelocity(peer.coordinateSpace), + ); + this.registerDisposer(peer); this.velocity.changed.add(() => { if (this.positionLink.value === NavigationLinkType.UNLINKED) { @@ -1008,7 +1011,7 @@ export class OrientationState extends RefCounted { try { parseFiniteVec(this.orientation, obj); quat.normalize(this.orientation, this.orientation); - } catch (ignoredError) { + } catch { quat.identity(this.orientation); } this.changed.dispatch(); @@ -1447,17 +1450,10 @@ export function validateDisplayDimensionRenderInfoProperty( export class WatchableDisplayDimensionRenderInfo extends RefCounted { changed = new NullarySignal(); - private curRelativeDisplayScales: RelativeDisplayScales = - this.relativeDisplayScales.value; - private curDisplayDimensions: DisplayDimensions = - this.displayDimensions.value; - private curCoordinateSpace: CoordinateSpace = - this.relativeDisplayScales.coordinateSpace.value; - private value_: DisplayDimensionRenderInfo = getDisplayDimensionRenderInfo( - this.curCoordinateSpace, - this.curDisplayDimensions, - this.curRelativeDisplayScales, - ); + private curRelativeDisplayScales: RelativeDisplayScales; + private curDisplayDimensions: DisplayDimensions; + private curCoordinateSpace: CoordinateSpace; + private value_: DisplayDimensionRenderInfo; get value() { const { relativeDisplayScales: { @@ -1495,6 +1491,15 @@ export class WatchableDisplayDimensionRenderInfo extends RefCounted { public displayDimensions: Owned, ) { super(); + this.curRelativeDisplayScales = this.relativeDisplayScales.value; + this.curDisplayDimensions = this.displayDimensions.value; + this.curCoordinateSpace = this.relativeDisplayScales.coordinateSpace.value; + this.value_ = getDisplayDimensionRenderInfo( + this.curCoordinateSpace, + this.curDisplayDimensions, + this.curRelativeDisplayScales, + ); + this.registerDisposer(relativeDisplayScales); this.registerDisposer(displayDimensions); const maybeUpdateValue = () => { diff --git a/src/overlay.ts b/src/overlay.ts index 3703e05e2e..8ead82ac04 100644 --- a/src/overlay.ts +++ b/src/overlay.ts @@ -47,11 +47,15 @@ export class Overlay extends RefCounted { document.body.appendChild(container); this.registerDisposer(new KeyboardEventBinder(this.container, this.keyMap)); this.registerEventListener(container, "action:close", () => { - this.dispose(); + this.close(); }); content.focus(); } + close() { + this.dispose(); + } + disposed() { --overlaysOpen; document.body.removeChild(this.container); diff --git a/src/perspective_view/panel.ts b/src/perspective_view/panel.ts index 2f0bceb0fc..20b1d82e7a 100644 --- a/src/perspective_view/panel.ts +++ b/src/perspective_view/panel.ts @@ -269,7 +269,7 @@ class PerspectiveViewState extends PerspectiveViewStateBase { } export class PerspectivePanel extends RenderedDataPanel { - viewer: PerspectiveViewerState; + declare viewer: PerspectiveViewerState; projectionParameters: Owned; @@ -605,7 +605,7 @@ export class PerspectivePanel extends RenderedDataPanel { } ensureBoundsUpdated() { - super.ensureBoundsUpdated(); + super.ensureBoundsUpdated(true /* canScaleForScreenshot */); this.projectionParameters.setViewport(this.renderViewport); } diff --git a/src/python_integration/prefetch.ts b/src/python_integration/prefetch.ts index c75d7caf12..28f9ae0370 100644 --- a/src/python_integration/prefetch.ts +++ b/src/python_integration/prefetch.ts @@ -20,7 +20,8 @@ */ import { debounce } from "lodash-es"; -import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { DataManagementContext } from "#src/data_management_context.js"; +import type { DataSourceRegistry } from "#src/datasource/index.js"; import type { DisplayContext } from "#src/display_context.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -31,10 +32,7 @@ import { verifyObjectProperty, } from "#src/util/json.js"; import { NullarySignal } from "#src/util/signal.js"; -import type { - DataManagementContext, - ViewerUIConfiguration, -} from "#src/viewer.js"; +import type { ViewerUIConfiguration } from "#src/viewer.js"; import { Viewer } from "#src/viewer.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; @@ -46,7 +44,7 @@ export class PrefetchManager extends RefCounted { constructor( public display: Borrowed, - public dataSourceProvider: DataSourceProviderRegistry, + public dataSourceProvider: DataSourceRegistry, public dataContext: Owned, public uiConfiguration: ViewerUIConfiguration, ) { diff --git a/src/python_integration/screenshots.ts b/src/python_integration/screenshots.ts index ca5b394978..ce8233d948 100644 --- a/src/python_integration/screenshots.ts +++ b/src/python_integration/screenshots.ts @@ -28,11 +28,54 @@ import { convertEndian32, Endianness } from "#src/util/endian.js"; import { verifyOptionalString } from "#src/util/json.js"; import { Signal } from "#src/util/signal.js"; import { getCachedJson } from "#src/util/trackable.js"; +import { ScreenshotMode } from "#src/util/trackable_screenshot_mode.js"; +import type { ResolutionMetadata } from "#src/util/viewer_resolution_stats.js"; +import { getViewerResolutionMetadata } from "#src/util/viewer_resolution_stats.js"; import type { Viewer } from "#src/viewer.js"; +export interface ScreenshotResult { + id: string; + image: string; + imageType: string; + depthData: string | undefined; + width: number; + height: number; + resolutionMetadata: ResolutionMetadata; +} + +export interface ScreenshotActionState { + viewerState: any; + selectedValues: any; + screenshot: ScreenshotResult; +} + +export interface ScreenshotChunkStatistics { + downloadLatency: number; + visibleChunksDownloading: number; + visibleChunksFailed: number; + visibleChunksGpuMemory: number; + visibleChunksSystemMemory: number; + visibleChunksTotal: number; + visibleGpuMemory: number; +} + +export interface StatisticsActionState { + viewerState: any; + selectedValues: any; + screenshotStatistics: { + id: string; + chunkSources: any[]; + total: ScreenshotChunkStatistics; + }; +} + export class ScreenshotHandler extends RefCounted { - sendScreenshotRequested = new Signal<(state: any) => void>(); - sendStatisticsRequested = new Signal<(state: any) => void>(); + sendScreenshotRequested = new Signal< + (state: ScreenshotActionState) => void + >(); + sendStatisticsRequested = new Signal< + (state: StatisticsActionState) => void + >(); requestState = new TrackableValue( undefined, verifyOptionalString, @@ -124,12 +167,14 @@ export class ScreenshotHandler extends RefCounted { return; } const { viewer } = this; - if (!viewer.isReady()) { + const shouldForceScreenshot = + this.viewer.display.screenshotMode.value === ScreenshotMode.FORCE; + if (!viewer.isReady() && !shouldForceScreenshot) { this.wasAlreadyVisible = false; this.throttledSendStatistics(requestState); return; } - if (!this.wasAlreadyVisible) { + if (!this.wasAlreadyVisible && !shouldForceScreenshot) { this.throttledSendStatistics(requestState); this.wasAlreadyVisible = true; this.debouncedMaybeSendScreenshot(); @@ -140,6 +185,7 @@ export class ScreenshotHandler extends RefCounted { this.throttledSendStatistics.cancel(); viewer.display.draw(); const screenshotData = viewer.display.canvas.toDataURL(); + const resolutionMetadata = getViewerResolutionMetadata(viewer); const { width, height } = viewer.display.canvas; const prefix = "data:image/png;base64,"; let imageType: string; @@ -169,6 +215,7 @@ export class ScreenshotHandler extends RefCounted { depthData, width, height, + resolutionMetadata, }, }; diff --git a/src/python_integration/volume.ts b/src/python_integration/volume.ts index 8820099eda..39d1d5a93a 100644 --- a/src/python_integration/volume.ts +++ b/src/python_integration/volume.ts @@ -33,8 +33,6 @@ import type { VolumeChunkSource } from "#src/sliceview/volume/frontend.js"; import { SliceViewVolumeRenderLayer } from "#src/sliceview/volume/renderlayer.js"; import { TrackableValue } from "#src/trackable_value.js"; import { arraysEqual } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; import { RefCounted } from "#src/util/disposable.js"; import { valueOrThrow } from "#src/util/error.js"; @@ -374,7 +372,7 @@ export class VolumeRequestHandler extends RefCounted { (requestId: string, response: unknown) => void >(); - private alreadyHandledRequests = new Map(); + private alreadyHandledRequests = new Map(); private debouncedMaybeHandleRequests = this.registerCancellable( debounce(() => this.maybeHandleRequests(), 0), ); @@ -397,9 +395,9 @@ export class VolumeRequestHandler extends RefCounted { const { id } = request; seenRequests.add(id); if (alreadyHandledRequests.has(id)) continue; - const source = new CancellationTokenSource(); + const abortController = new AbortController(); try { - if (!this.maybeHandleRequest(request, source)) { + if (!this.maybeHandleRequest(request, abortController.signal)) { continue; } } catch (e) { @@ -409,12 +407,12 @@ export class VolumeRequestHandler extends RefCounted { }); } } - alreadyHandledRequests.set(id, source); + alreadyHandledRequests.set(id, abortController); } - for (const [requestId, cancellationSource] of alreadyHandledRequests) { + for (const [requestId, abortController] of alreadyHandledRequests) { if (!seenRequests.has(requestId)) { - cancellationSource.cancel(); + abortController.abort(); alreadyHandledRequests.delete(requestId); } } @@ -422,7 +420,7 @@ export class VolumeRequestHandler extends RefCounted { private maybeHandleRequest( request: VolumeRequest, - cancellationToken: CancellationToken, + signal: AbortSignal, ): boolean { const layer = this.viewer.layerManager.getLayerByName(request.layer); if (layer === undefined) { @@ -588,7 +586,7 @@ export class VolumeRequestHandler extends RefCounted { order: info.order, }; }, - cancellationToken, + { signal }, ); } catch (e) { response = { error: e.message }; diff --git a/src/render_coordinate_transform.ts b/src/render_coordinate_transform.ts index 36e31a7829..1987061306 100644 --- a/src/render_coordinate_transform.ts +++ b/src/render_coordinate_transform.ts @@ -287,7 +287,7 @@ export function getRenderLayerTransform( subspaceRank + 1, subspaceRank + 1, subspaceRank + 1, - ); + ) as Float32Array; } const channelSpaceShape = new Uint32Array(channelRank); const { diff --git a/src/renderlayer.ts b/src/renderlayer.ts index c874fac970..2fbea24894 100644 --- a/src/renderlayer.ts +++ b/src/renderlayer.ts @@ -257,6 +257,28 @@ export class SharedProjectionParameters< public updateInterval = 10, ) { super(); + this.update = this.registerCancellable( + debounce((_oldValue: T, newValue: T) => { + // Note: Because we are using debouce, we cannot rely on `_oldValue`, since + // `DerivedProjectionParameters` reuses the objects. + let valueUpdate: any; + if ( + newValue.displayDimensionRenderInfo !== + this.prevDisplayDimensionRenderInfo + ) { + valueUpdate = newValue; + this.prevDisplayDimensionRenderInfo = + newValue.displayDimensionRenderInfo; + } else { + const { displayDimensionRenderInfo, ...remainder } = newValue; + valueUpdate = remainder; + } + this.rpc!.invoke(PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, { + id: this.rpcId, + value: valueUpdate, + }); + }, this.updateInterval), + ); this.initializeCounterpart(rpc, { value: base.value }); this.registerDisposer(base.changed.add(this.update)); } @@ -265,26 +287,5 @@ export class SharedProjectionParameters< this.update.flush(); } - private update = this.registerCancellable( - debounce((_oldValue: T, newValue: T) => { - // Note: Because we are using debouce, we cannot rely on `_oldValue`, since - // `DerivedProjectionParameters` reuses the objects. - let valueUpdate: any; - if ( - newValue.displayDimensionRenderInfo !== - this.prevDisplayDimensionRenderInfo - ) { - valueUpdate = newValue; - this.prevDisplayDimensionRenderInfo = - newValue.displayDimensionRenderInfo; - } else { - const { displayDimensionRenderInfo, ...remainder } = newValue; - valueUpdate = remainder; - } - this.rpc!.invoke(PROJECTION_PARAMETERS_CHANGED_RPC_METHOD_ID, { - id: this.rpcId, - value: valueUpdate, - }); - }, this.updateInterval), - ); + private update; } diff --git a/src/segment_color.ts b/src/segment_color.ts index d7d5db0ba5..db966a9f4a 100644 --- a/src/segment_color.ts +++ b/src/segment_color.ts @@ -33,9 +33,11 @@ import { glsl_hsvToRgb, glsl_uint64 } from "#src/webgl/shader_lib.js"; const NUM_COMPONENTS = 2; export class SegmentColorShaderManager { - seedName = this.prefix + "_seed"; + seedName: string; - constructor(public prefix: string) {} + constructor(public prefix: string) { + this.seedName = prefix + "_seed"; + } defineShader(builder: ShaderBuilder) { const { seedName } = this; diff --git a/src/segmentation_display_state/property_map.ts b/src/segmentation_display_state/property_map.ts index 943bee7110..e4e5d90f39 100644 --- a/src/segmentation_display_state/property_map.ts +++ b/src/segmentation_display_state/property_map.ts @@ -19,11 +19,7 @@ import { ChunkSource } from "#src/chunk_manager/frontend.js"; import type { IndexedSegmentProperty } from "#src/segmentation_display_state/base.js"; import type { Uint64OrderedSet } from "#src/uint64_ordered_set.js"; import type { Uint64Set } from "#src/uint64_set.js"; -import type { - TypedArray, - TypedArrayConstructor, - WritableArrayLike, -} from "#src/util/array.js"; +import type { TypedArray, WritableArrayLike } from "#src/util/array.js"; import { mergeSequences } from "#src/util/array.js"; import { DataType } from "#src/util/data_type.js"; import type { Borrowed } from "#src/util/disposable.js"; @@ -68,13 +64,13 @@ export interface InlineSegmentNumericalProperty { type: "number"; dataType: DataType; description: string | undefined; - values: TypedArray; + values: TypedArray; bounds: DataTypeInterval; } export interface InlineSegmentPropertyMap { // Specifies low/high 32-bit portions of ids. - ids: Uint32Array; + ids: Uint32Array; properties: InlineSegmentProperty[]; } @@ -83,7 +79,7 @@ export interface IndexedSegmentPropertyMapOptions { } export class IndexedSegmentPropertySource extends ChunkSource { - OPTIONS: IndexedSegmentPropertyMapOptions; + declare OPTIONS: IndexedSegmentPropertyMapOptions; properties: readonly Readonly[]; constructor( @@ -289,9 +285,7 @@ export function normalizeInlineSegmentPropertyMap( } const properties = inlineProperties.properties.map((property) => { const { values } = property; - const newValues = new (values.constructor as - | TypedArrayConstructor - | typeof Array)(length); + const newValues = new (values.constructor as typeof Array)(length); for (let i = 0; i < length; ++i) { newValues[i] = values[permutation[i]]; } @@ -385,7 +379,7 @@ function mergeInlinePropertyMaps( ++numUnique; }, ); - let ids: Uint32Array; + let ids: Uint32Array; if (numUnique === aCount) { ids = aIds; } else if (numUnique === bCount) { @@ -687,7 +681,7 @@ export function parseSegmentQuery( } try { parsed.regexp = new RegExp(word.substring(1)); - } catch (e) { + } catch { errors.push({ begin: startIndex, end: endIndex, diff --git a/src/single_mesh/backend.ts b/src/single_mesh/backend.ts index 0ad2650529..3357260995 100644 --- a/src/single_mesh/backend.ts +++ b/src/single_mesh/backend.ts @@ -14,17 +14,14 @@ * limitations under the License. */ -import type { ChunkManager } from "#src/chunk_manager/backend.js"; import { Chunk, ChunkSource, withChunkManager, WithParameters, } from "#src/chunk_manager/backend.js"; -import { ChunkPriorityTier } from "#src/chunk_manager/base.js"; -import type { PriorityGetter } from "#src/chunk_manager/generic_file_source.js"; -import type { SharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; -import { WithSharedCredentialsProviderCounterpart } from "#src/credentials_provider/shared_counterpart.js"; +import type { SharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; +import { WithSharedKvStoreContextCounterpart } from "#src/kvstore/backend.js"; import { computeVertexNormals } from "#src/mesh/backend.js"; import type { SingleMeshData, @@ -39,12 +36,8 @@ import { SingleMeshSourceParametersWithInfo, } from "#src/single_mesh/base.js"; import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { stableStringify } from "#src/util/json.js"; -import type { - SpecialProtocolCredentials, - SpecialProtocolCredentialsProvider, -} from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { getBasePriority, getPriorityTier, @@ -113,11 +106,9 @@ export interface SingleMeshVertexAttributes { interface SingleMeshFactory { description?: string; getMesh: ( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, + options: Partial, ) => Promise; } @@ -150,20 +141,12 @@ function getDataSource( } export function getMesh( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, url: string, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, + options: Partial, ) { const [factory, path] = getDataSource(singleMeshFactories, url); - return factory.getMesh( - chunkManager, - credentialsProvider, - path, - getPriority, - cancellationToken, - ); + return factory.getMesh(sharedKvStoreContext, path, options); } export function getMinMax(array: TypedArray): [number, number] { @@ -177,26 +160,16 @@ export function getMinMax(array: TypedArray): [number, number] { } export function getCombinedMesh( - chunkManager: ChunkManager, - credentialsProvider: SpecialProtocolCredentialsProvider, + sharedKvStoreContext: SharedKvStoreContextCounterpart, parameters: SingleMeshSourceParameters, - getPriority: PriorityGetter, - cancellationToken: CancellationToken, + options: Partial, ) { - return getMesh( - chunkManager, - credentialsProvider, - parameters.meshSourceUrl, - getPriority, - cancellationToken, - ); + return getMesh(sharedKvStoreContext, parameters.meshSourceUrl, options); } @registerSharedObject() export class SingleMeshSource extends WithParameters( - WithSharedCredentialsProviderCounterpart()( - ChunkSource, - ), + WithSharedKvStoreContextCounterpart(ChunkSource), SingleMeshSourceParametersWithInfo, ) { getChunk() { @@ -210,31 +183,24 @@ export class SingleMeshSource extends WithParameters( return chunk; } - download(chunk: SingleMeshChunk, cancellationToken: CancellationToken) { - const getPriority = () => ({ - priorityTier: chunk.priorityTier, - priority: chunk.priority, - }); - return getCombinedMesh( - this.chunkManager, - this.credentialsProvider, + async download(chunk: SingleMeshChunk, signal: AbortSignal) { + const data = await getCombinedMesh( + this.sharedKvStoreContext, this.parameters, - getPriority, - cancellationToken, - ).then((data) => { - if ( - stableStringify(data.info) !== stableStringify(this.parameters.info) - ) { - throw new Error("Mesh info has changed."); - } - if (data.vertexNormals === undefined) { - data.vertexNormals = computeVertexNormals( - data.vertexPositions, - data.indices, - ); - } - chunk.data = data; - }); + { + signal, + }, + ); + if (stableStringify(data.info) !== stableStringify(this.parameters.info)) { + throw new Error("Mesh info has changed."); + } + if (data.vertexNormals === undefined) { + data.vertexNormals = computeVertexNormals( + data.vertexPositions, + data.indices, + ); + } + chunk.data = data; } } @@ -274,33 +240,18 @@ export class SingleMeshLayer extends SingleMeshLayerBase { } } -const INFO_PRIORITY = 1000; - registerPromiseRPC( GET_SINGLE_MESH_INFO_RPC_ID, - async function (x, cancellationToken): RPCPromise { - const chunkManager = this.getRef(x.chunkManager); - const credentialsProvider = this.getOptionalRef< - SharedCredentialsProviderCounterpart< - Exclude - > - >(x.credentialsProvider); - try { - const parameters = x.parameters; - const mesh = await getCombinedMesh( - chunkManager, - credentialsProvider, - parameters, - () => ({ - priorityTier: ChunkPriorityTier.VISIBLE, - priority: INFO_PRIORITY, - }), - cancellationToken, - ); - return { value: mesh.info }; - } finally { - chunkManager.dispose(); - credentialsProvider?.dispose(); - } + async function (x, progressOptions): RPCPromise { + const sharedKvStoreContext = this.get( + x.sharedKvStoreContext, + ) as SharedKvStoreContextCounterpart; + const parameters = x.parameters; + const mesh = await getCombinedMesh( + sharedKvStoreContext, + parameters, + progressOptions, + ); + return { value: mesh.info }; }, ); diff --git a/src/single_mesh/base.ts b/src/single_mesh/base.ts index 30c499c758..c56421975c 100644 --- a/src/single_mesh/base.ts +++ b/src/single_mesh/base.ts @@ -39,10 +39,10 @@ export interface SingleMeshInfo { } export interface SingleMeshData { - vertexPositions: Float32Array; - indices: Uint32Array; - vertexNormals?: Float32Array; - vertexAttributes: Float32Array[]; + vertexPositions: Float32Array; + indices: Uint32Array; + vertexNormals?: Float32Array; + vertexAttributes: Float32Array[]; } export class SingleMeshSourceParameters { diff --git a/src/single_mesh/frontend.ts b/src/single_mesh/frontend.ts index 233f1f69d1..61202c7356 100644 --- a/src/single_mesh/frontend.ts +++ b/src/single_mesh/frontend.ts @@ -15,17 +15,23 @@ */ import { ChunkState } from "#src/chunk_manager/base.js"; -import type { ChunkManager } from "#src/chunk_manager/frontend.js"; import { Chunk, ChunkSource, WithParameters, } from "#src/chunk_manager/frontend.js"; import { - getCredentialsProviderCounterpart, - WithCredentialsProvider, -} from "#src/credentials_provider/chunk_source_frontend.js"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; + makeCoordinateSpace, + makeIdentityTransform, +} from "#src/coordinate_transform.js"; +import type { + DataSource, + GetKvStoreBasedDataSourceOptions, + KvStoreBasedDataSourceProvider, +} from "#src/datasource/index.js"; +import { WithSharedKvStoreContext } from "#src/kvstore/chunk_source_frontend.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { ensureEmptyUrlSuffix } from "#src/kvstore/url.js"; import type { PickState, VisibleLayerInfo } from "#src/layer/index.js"; import type { PerspectivePanel } from "#src/perspective_view/panel.js"; import type { PerspectiveViewRenderContext } from "#src/perspective_view/render_layer.js"; @@ -47,10 +53,9 @@ import { WatchableValue } from "#src/trackable_value.js"; import { DataType } from "#src/util/data_type.js"; import type { mat4 } from "#src/util/geom.js"; import { vec3 } from "#src/util/geom.js"; -import type { SpecialProtocolCredentials } from "#src/util/special_protocol_request.js"; -import { parseSpecialUrl } from "#src/util/special_protocol_request.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { GL } from "#src/webgl/context.js"; import { @@ -400,8 +405,8 @@ export class VertexChunkData { } export class SingleMeshChunk extends Chunk { - source: SingleMeshSource; - indexBuffer: Buffer; + declare source: SingleMeshSource; + indexBuffer: GLBuffer; numIndices: number; indices: Uint32Array; vertexData: VertexChunkData; @@ -439,7 +444,7 @@ export function getAttributeTextureFormats( } export class SingleMeshSource extends WithParameters( - WithCredentialsProvider()(ChunkSource), + WithSharedKvStoreContext(ChunkSource), SingleMeshSourceParametersWithInfo, ) { attributeTextureFormats = getAttributeTextureFormats( @@ -459,51 +464,55 @@ const SharedObjectWithSharedVisibility = withSharedVisibility(SharedObject); class SingleMeshLayerSharedObject extends SharedObjectWithSharedVisibility {} export class SingleMeshLayer extends PerspectiveViewRenderLayer { - private shaderManager = new SingleMeshShaderManager( - pickAttributeNames(this.source.info.vertexAttributes.map((a) => a.name)), - this.source.info.vertexAttributes, - ); + private shaderManager: SingleMeshShaderManager; private shaders = new Map(); private sharedObject = this.registerDisposer( new SingleMeshLayerSharedObject(), ); - private shaderGetter = parameterizedEmitterDependentShaderGetter( - this, - this.gl, - { - memoizeKey: { - t: "single_mesh/RenderLayer", - attributes: this.source.info.vertexAttributes, - }, - fallbackParameters: new WatchableValue( - getFallbackBuilderState(parseShaderUiControls(DEFAULT_FRAGMENT_MAIN)), - ), - parameters: this.displayState.shaderControlState.builderState, - encodeParameters: (p) => p.key, - shaderError: this.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - addControlsToBuilder(shaderBuilderState, builder); - this.shaderManager.defineShader(builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }, - ); - - protected countingBuffer = this.registerDisposer(getCountingBuffer(this.gl)); + private shaderGetter; + protected countingBuffer; constructor( public source: SingleMeshSource, public displayState: SingleMeshDisplayState, public transform: WatchableRenderLayerTransform, ) { super(); + this.shaderManager = new SingleMeshShaderManager( + pickAttributeNames(source.info.vertexAttributes.map((a) => a.name)), + source.info.vertexAttributes, + ); + this.shaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + t: "single_mesh/RenderLayer", + attributes: this.source.info.vertexAttributes, + }, + fallbackParameters: new WatchableValue( + getFallbackBuilderState(parseShaderUiControls(DEFAULT_FRAGMENT_MAIN)), + ), + parameters: this.displayState.shaderControlState.builderState, + encodeParameters: (p) => p.key, + shaderError: this.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + addControlsToBuilder(shaderBuilderState, builder); + this.shaderManager.defineShader(builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); + + this.countingBuffer = this.registerDisposer(getCountingBuffer(this.gl)); + this.registerDisposer( displayState.shaderControlState.parseResult.changed.add( this.redrawNeeded.dispatch, @@ -646,46 +655,77 @@ export class SingleMeshLayer extends PerspectiveViewRenderLayer, ) { - return chunkManager.memoize.getUncounted( + return sharedKvStoreContext.chunkManager.memoize.getAsync( { type: "single_mesh:getMeshInfo", url }, - async () => { - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); - const info = await chunkManager.rpc!.promiseInvoke( - GET_SINGLE_MESH_INFO_RPC_ID, - { - chunkManager: chunkManager.addCounterpartRef(), - credentialsProvider: - getCredentialsProviderCounterpart( - chunkManager, - credentialsProvider, - ), - parameters: { meshSourceUrl: parsedUrl }, - }, - ); - return { info, url: parsedUrl, credentialsProvider }; + options, + async (progressOptions) => { + const info = + await sharedKvStoreContext.chunkManager.rpc!.promiseInvoke( + GET_SINGLE_MESH_INFO_RPC_ID, + { + sharedKvStoreContext: sharedKvStoreContext.rpcId, + parameters: { meshSourceUrl: url }, + }, + { + signal: progressOptions.signal, + progressListener: options.progressListener, + }, + ); + return info; }, ); } export async function getSingleMeshSource( - chunkManager: ChunkManager, - credentialsManager: CredentialsManager, + sharedKvStoreContext: SharedKvStoreContext, url: string, + options: Partial, ) { - const { - info, - url: parsedUrl, - credentialsProvider, - } = await getSingleMeshInfo(chunkManager, credentialsManager, url); - return chunkManager.getChunkSource(SingleMeshSource, { - credentialsProvider, - parameters: { meshSourceUrl: parsedUrl, info }, + const info = await getSingleMeshInfo(sharedKvStoreContext, url, options); + return sharedKvStoreContext.chunkManager.getChunkSource(SingleMeshSource, { + sharedKvStoreContext, + parameters: { meshSourceUrl: url, info }, }); } + +export class SingleMeshDataSource implements KvStoreBasedDataSourceProvider { + constructor( + public scheme: string, + public description: string, + ) {} + + get singleFile() { + return true; + } + + async get(options: GetKvStoreBasedDataSourceOptions): Promise { + ensureEmptyUrlSuffix(options.url); + const meshSource = await getSingleMeshSource( + options.registry.sharedKvStoreContext, + `${options.url.scheme}://${options.kvStoreUrl}`, + options, + ); + const modelSpace = makeCoordinateSpace({ + rank: 3, + names: ["x", "y", "z"], + units: ["m", "m", "m"], + scales: Float64Array.of(1e-9, 1e-9, 1e-9), + }); + const dataSource: DataSource = { + canonicalUrl: `${options.kvStoreUrl}|${options.url.scheme}:`, + modelTransform: makeIdentityTransform(modelSpace), + subsources: [ + { + id: "default", + default: true, + subsource: { singleMesh: meshSource }, + }, + ], + }; + return dataSource; + } +} diff --git a/src/skeleton/backend.ts b/src/skeleton/backend.ts index cae8989b4d..f47c1a190e 100644 --- a/src/skeleton/backend.ts +++ b/src/skeleton/backend.ts @@ -120,7 +120,7 @@ export class SkeletonChunk extends Chunk { } export class SkeletonSource extends ChunkSource { - chunks: Map; + declare chunks: Map; getChunk(objectId: Uint64) { const key = getObjectKey(objectId); let chunk = this.chunks.get(key); diff --git a/src/skeleton/frontend.ts b/src/skeleton/frontend.ts index dc84c40b73..c95e8303ad 100644 --- a/src/skeleton/frontend.ts +++ b/src/skeleton/frontend.ts @@ -51,7 +51,7 @@ import { NullarySignal } from "#src/util/signal.js"; import type { Trackable } from "#src/util/trackable.js"; import { CompoundTrackable } from "#src/util/trackable.js"; import { TrackableEnum } from "#src/util/trackable_enum.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import { defineCircleShader, drawCircles, @@ -117,7 +117,7 @@ class RenderHelper extends RefCounted { private textureAccessHelper = new OneDimensionalTextureAccessHelper( "vertexData", ); - private vertexIdHelper = this.registerDisposer(VertexIdHelper.get(this.gl)); + private vertexIdHelper; get vertexAttributes(): VertexAttributeRenderInfo[] { return this.base.vertexAttributes; } @@ -129,29 +129,45 @@ class RenderHelper extends RefCounted { builder.addUniform("highp uint", "uPickID"); } - edgeShaderGetter = parameterizedEmitterDependentShaderGetter(this, this.gl, { - memoizeKey: { - type: "skeleton/SkeletonShaderManager/edge", - vertexAttributes: this.vertexAttributes, - }, - fallbackParameters: this.base.fallbackShaderParameters, - parameters: - this.base.displayState.skeletonRenderingOptions.shaderControlState - .builderState, - shaderError: this.base.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - this.defineCommonShader(builder); - this.defineAttributeAccess(builder); - defineLineShader(builder); - builder.addAttribute("highp uvec2", "aVertexIndex"); - builder.addUniform("highp float", "uLineWidth"); - let vertexMain = ` + edgeShaderGetter; + nodeShaderGetter; + + get gl(): GL { + return this.base.gl; + } + + constructor( + public base: SkeletonLayer, + public targetIsSliceView: boolean, + ) { + super(); + this.vertexIdHelper = this.registerDisposer(VertexIdHelper.get(this.gl)); + this.edgeShaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + type: "skeleton/SkeletonShaderManager/edge", + vertexAttributes: this.vertexAttributes, + }, + fallbackParameters: this.base.fallbackShaderParameters, + parameters: + this.base.displayState.skeletonRenderingOptions.shaderControlState + .builderState, + shaderError: this.base.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + this.defineCommonShader(builder); + this.defineAttributeAccess(builder); + defineLineShader(builder); + builder.addAttribute("highp uvec2", "aVertexIndex"); + builder.addUniform("highp float", "uLineWidth"); + let vertexMain = ` highp vec3 vertexA = readAttribute0(aVertexIndex.x); highp vec3 vertexB = readAttribute0(aVertexIndex.y); emitLine(uProjection, vertexA, vertexB, uLineWidth); @@ -159,7 +175,7 @@ highp uint lineEndpointIndex = getLineEndpointIndex(); highp uint vertexIndex = aVertexIndex.x * lineEndpointIndex + aVertexIndex.y * (1u - lineEndpointIndex); `; - builder.addFragmentCode(` + builder.addFragmentCode(` vec4 segmentColor() { return uColor; } @@ -170,51 +186,58 @@ void emitDefault() { emit(vec4(uColor.rgb, uColor.a * getLineAlpha() * ${this.getCrossSectionFadeFactor()}), uPickID); } `); - builder.addFragmentCode(glsl_COLORMAPS); - const { vertexAttributes } = this; - const numAttributes = vertexAttributes.length; - for (let i = 1; i < numAttributes; ++i) { - const info = vertexAttributes[i]; - builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); - vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; - builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); - } - builder.setVertexMain(vertexMain); - addControlsToBuilder(shaderBuilderState, builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }); - - nodeShaderGetter = parameterizedEmitterDependentShaderGetter(this, this.gl, { - memoizeKey: { - type: "skeleton/SkeletonShaderManager/node", - vertexAttributes: this.vertexAttributes, - }, - fallbackParameters: this.base.fallbackShaderParameters, - parameters: - this.base.displayState.skeletonRenderingOptions.shaderControlState - .builderState, - shaderError: this.base.displayState.shaderError, - defineShader: ( - builder: ShaderBuilder, - shaderBuilderState: ShaderControlsBuilderState, - ) => { - if (shaderBuilderState.parseResult.errors.length !== 0) { - throw new Error("Invalid UI control specification"); - } - this.defineCommonShader(builder); - this.defineAttributeAccess(builder); - defineCircleShader(builder, /*crossSectionFade=*/ this.targetIsSliceView); - builder.addUniform("highp float", "uNodeDiameter"); - let vertexMain = ` + builder.addFragmentCode(glsl_COLORMAPS); + const { vertexAttributes } = this; + const numAttributes = vertexAttributes.length; + for (let i = 1; i < numAttributes; ++i) { + const info = vertexAttributes[i]; + builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); + vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; + builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); + } + builder.setVertexMain(vertexMain); + addControlsToBuilder(shaderBuilderState, builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); + + this.nodeShaderGetter = parameterizedEmitterDependentShaderGetter( + this, + this.gl, + { + memoizeKey: { + type: "skeleton/SkeletonShaderManager/node", + vertexAttributes: this.vertexAttributes, + }, + fallbackParameters: this.base.fallbackShaderParameters, + parameters: + this.base.displayState.skeletonRenderingOptions.shaderControlState + .builderState, + shaderError: this.base.displayState.shaderError, + defineShader: ( + builder: ShaderBuilder, + shaderBuilderState: ShaderControlsBuilderState, + ) => { + if (shaderBuilderState.parseResult.errors.length !== 0) { + throw new Error("Invalid UI control specification"); + } + this.defineCommonShader(builder); + this.defineAttributeAccess(builder); + defineCircleShader( + builder, + /*crossSectionFade=*/ this.targetIsSliceView, + ); + builder.addUniform("highp float", "uNodeDiameter"); + let vertexMain = ` highp uint vertexIndex = uint(gl_InstanceID); highp vec3 vertexPosition = readAttribute0(vertexIndex); emitCircle(uProjection * vec4(vertexPosition, 1.0), uNodeDiameter, 0.0); `; - builder.addFragmentCode(` + builder.addFragmentCode(` vec4 segmentColor() { return uColor; } @@ -229,32 +252,23 @@ void emitDefault() { emitRGBA(uColor); } `); - builder.addFragmentCode(glsl_COLORMAPS); - const { vertexAttributes } = this; - const numAttributes = vertexAttributes.length; - for (let i = 1; i < numAttributes; ++i) { - const info = vertexAttributes[i]; - builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); - vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; - builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); - } - builder.setVertexMain(vertexMain); - addControlsToBuilder(shaderBuilderState, builder); - builder.setFragmentMainFunction( - shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), - ); - }, - }); - - get gl(): GL { - return this.base.gl; - } - - constructor( - public base: SkeletonLayer, - public targetIsSliceView: boolean, - ) { - super(); + builder.addFragmentCode(glsl_COLORMAPS); + const { vertexAttributes } = this; + const numAttributes = vertexAttributes.length; + for (let i = 1; i < numAttributes; ++i) { + const info = vertexAttributes[i]; + builder.addVarying(`highp ${info.glslDataType}`, `vCustom${i}`); + vertexMain += `vCustom${i} = readAttribute${i}(vertexIndex);\n`; + builder.addFragmentCode(`#define ${info.name} vCustom${i}\n`); + } + builder.setVertexMain(vertexMain); + addControlsToBuilder(shaderBuilderState, builder); + builder.setFragmentMainFunction( + shaderCodeWithLineDirective(shaderBuilderState.parseResult.code), + ); + }, + }, + ); } defineAttributeAccess(builder: ShaderBuilder) { @@ -648,13 +662,13 @@ export class SkeletonLayer extends RefCounted { } export class PerspectiveViewSkeletonLayer extends PerspectiveViewRenderLayer { - private renderHelper = this.registerDisposer( - new RenderHelper(this.base, false), - ); - private renderOptions = - this.base.displayState.skeletonRenderingOptions.params3d; + private renderHelper: RenderHelper; + private renderOptions: ViewSpecificSkeletonRenderingOptions; constructor(public base: SkeletonLayer) { super(); + this.renderHelper = this.registerDisposer(new RenderHelper(base, false)); + this.renderOptions = base.displayState.skeletonRenderingOptions.params3d; + this.layerChunkProgressInfo = base.layerChunkProgressInfo; this.registerDisposer(base); this.registerDisposer(base.redrawNeeded.add(this.redrawNeeded.dispatch)); @@ -701,13 +715,12 @@ export class PerspectiveViewSkeletonLayer extends PerspectiveViewRenderLayer { } export class SliceViewPanelSkeletonLayer extends SliceViewPanelRenderLayer { - private renderHelper = this.registerDisposer( - new RenderHelper(this.base, true), - ); - private renderOptions = - this.base.displayState.skeletonRenderingOptions.params2d; + private renderHelper: RenderHelper; + private renderOptions: ViewSpecificSkeletonRenderingOptions; constructor(public base: SkeletonLayer) { super(); + this.renderHelper = this.registerDisposer(new RenderHelper(base, true)); + this.renderOptions = base.displayState.skeletonRenderingOptions.params2d; this.layerChunkProgressInfo = base.layerChunkProgressInfo; this.registerDisposer(base); const { renderOptions } = this; @@ -765,10 +778,10 @@ const vertexPositionAttribute: VertexAttributeRenderInfo = { }; export class SkeletonChunk extends Chunk { - source: SkeletonSource; + declare source: SkeletonSource; vertexAttributes: Uint8Array; indices: Uint32Array; - indexBuffer: Buffer; + indexBuffer: GLBuffer; numIndices: number; numVertices: number; vertexAttributeOffsets: Uint32Array; @@ -809,7 +822,7 @@ export class SkeletonChunk extends Chunk { vertexAttributeTextures[i] = texture; } gl.bindTexture(WebGL2RenderingContext.TEXTURE_2D, null); - this.indexBuffer = Buffer.fromData( + this.indexBuffer = GLBuffer.fromData( gl, this.indices, WebGL2RenderingContext.ARRAY_BUFFER, @@ -862,7 +875,7 @@ export class SkeletonSource extends ChunkSource { return attributeTextureFormats; } - chunks: Map; + declare chunks: Map; getChunk(x: any) { return new SkeletonChunk(this, x); } diff --git a/src/sliceview/backend.ts b/src/sliceview/backend.ts index f95e2062b7..a921901d2e 100644 --- a/src/sliceview/backend.ts +++ b/src/sliceview/backend.ts @@ -48,8 +48,7 @@ import { } from "#src/sliceview/base.js"; import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED } from "#src/util/cancellation.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { erf } from "#src/util/erf.js"; import { vec3, vec3Key } from "#src/util/geom.js"; import { VelocityEstimator } from "#src/util/velocity_estimation.js"; @@ -389,7 +388,7 @@ export class SliceViewChunkSourceBackend< implements SliceViewChunkSourceInterface { spec: Spec; - chunks: Map; + declare chunks: Map; constructor(rpc: RPC, options: any) { super(rpc, options); this.spec = options.spec; @@ -412,7 +411,7 @@ export class SliceViewRenderLayerBackend extends SharedObjectCounterpart implements SliceViewRenderLayerInterface, ChunkRenderLayerBackend { - rpcId: number; + declare rpcId: number; renderScaleTarget: SharedWatchableValue; localPosition: WatchableValueInterface; @@ -536,7 +535,7 @@ registerPromiseRPC( SLICEVIEW_REQUEST_CHUNK_RPC_ID, async function ( x: { this: RPC; source: number; chunkGridPosition: Float32Array }, - cancellationToken: CancellationToken, + progressOptions, ): RPCPromise { const source = this.get(x.source) as SliceViewChunkSourceBackend; const { chunkManager } = source; @@ -546,6 +545,10 @@ registerPromiseRPC( // Already available on frontend. return { value: undefined }; } + if (chunk.state === ChunkState.FAILED) { + // Already failed + throw chunk.error; + } const disposeRecompute = chunkManager.recomputeChunkPriorities.add(() => { chunkManager.requestChunk( chunk, @@ -568,13 +571,8 @@ registerPromiseRPC( }; }); source.registerChunkListener(key, listener!); - const cancelPromise = new Promise((_resolve, reject) => { - cancellationToken.add(() => { - reject(CANCELED); - }); - }); try { - await Promise.race([promise, cancelPromise]); + await raceWithAbort(promise, progressOptions.signal); return { value: undefined }; } finally { source.unregisterChunkListener(key, listener!); diff --git a/src/sliceview/backend_chunk_decoders/bossNpz.ts b/src/sliceview/backend_chunk_decoders/bossNpz.ts index e8f056ba08..250cc3ba4e 100644 --- a/src/sliceview/backend_chunk_decoders/bossNpz.ts +++ b/src/sliceview/backend_chunk_decoders/bossNpz.ts @@ -25,17 +25,18 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { vec3Key } from "#src/util/geom.js"; import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeBossNpzChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { - const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); + const parseResult = parseNpy( + new Uint8Array(await decodeGzip(response, "deflate")), + ); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; @@ -60,5 +61,5 @@ export async function decodeBossNpzChunk( } does not match expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, cancellationToken, parseResult.data); + await postProcessRawData(chunk, signal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts index e9e387456e..2a9a6d8358 100644 --- a/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts +++ b/src/sliceview/backend_chunk_decoders/compressed_segmentation.ts @@ -15,13 +15,12 @@ */ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressedSegmentationChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { - cancellationToken; + signal; chunk.data = new Uint32Array(response); } diff --git a/src/sliceview/backend_chunk_decoders/compresso.ts b/src/sliceview/backend_chunk_decoders/compresso.ts index b35548a3a6..c4e3ac680e 100644 --- a/src/sliceview/backend_chunk_decoders/compresso.ts +++ b/src/sliceview/backend_chunk_decoders/compresso.ts @@ -18,20 +18,18 @@ import { decodeCompresso } from "#src/async_computation/decode_compresso_request import { requestAsyncComputation } from "#src/async_computation/request.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { TypedArray } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeCompressoChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { - const image: TypedArray = await requestAsyncComputation( + const image = await requestAsyncComputation( decodeCompresso, - cancellationToken, + signal, [response], new Uint8Array(response), ); - await decodeRawChunk(chunk, cancellationToken, image.buffer); + await decodeRawChunk(chunk, signal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/index.ts b/src/sliceview/backend_chunk_decoders/index.ts index 04e3d8dd31..f9e4e94e83 100644 --- a/src/sliceview/backend_chunk_decoders/index.ts +++ b/src/sliceview/backend_chunk_decoders/index.ts @@ -20,9 +20,8 @@ */ import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export type ChunkDecoder = ( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) => Promise; diff --git a/src/sliceview/backend_chunk_decoders/jpeg.ts b/src/sliceview/backend_chunk_decoders/jpeg.ts index 854b84f667..6a9ede1553 100644 --- a/src/sliceview/backend_chunk_decoders/jpeg.ts +++ b/src/sliceview/backend_chunk_decoders/jpeg.ts @@ -18,17 +18,16 @@ import { decodeJpeg } from "#src/async_computation/decode_jpeg_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeJpegChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJpeg, - cancellationToken, + signal, [response], new Uint8Array(response), undefined, @@ -37,5 +36,5 @@ export async function decodeJpegChunk( chunkDataSize[3] || 1, false, ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, signal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/jxl.ts b/src/sliceview/backend_chunk_decoders/jxl.ts index 914367a715..f515d8f856 100644 --- a/src/sliceview/backend_chunk_decoders/jxl.ts +++ b/src/sliceview/backend_chunk_decoders/jxl.ts @@ -18,22 +18,21 @@ import { decodeJxl } from "#src/async_computation/decode_jxl_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function decodeJxlChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const { uint8Array: decoded } = await requestAsyncComputation( decodeJxl, - cancellationToken, + signal, [response], new Uint8Array(response), chunkDataSize[0] * chunkDataSize[1] * chunkDataSize[2], chunkDataSize[3] || 1, 1, // bytesPerPixel ); - await postProcessRawData(chunk, cancellationToken, decoded); + await postProcessRawData(chunk, signal, decoded); } diff --git a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts index a4b4fa2150..210129fd1d 100644 --- a/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts +++ b/src/sliceview/backend_chunk_decoders/ndstoreNpz.ts @@ -26,16 +26,17 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postpr import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; import { arraysEqual } from "#src/util/array.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { decodeGzip } from "#src/util/gzip.js"; import { parseNpy } from "#src/util/npy.js"; export async function decodeNdstoreNpzChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { - const parseResult = parseNpy(new Uint8Array(await decodeGzip(response))); + const parseResult = parseNpy( + new Uint8Array(await decodeGzip(response, "deflate")), + ); const chunkDataSize = chunk.chunkDataSize!; const source = chunk.source!; const { shape } = parseResult; @@ -54,5 +55,5 @@ export async function decodeNdstoreNpzChunk( `expected data type ${DataType[spec.dataType]}`, ); } - await postProcessRawData(chunk, cancellationToken, parseResult.data); + await postProcessRawData(chunk, signal, parseResult.data); } diff --git a/src/sliceview/backend_chunk_decoders/png.ts b/src/sliceview/backend_chunk_decoders/png.ts index f5d34b5e50..22bb9f37e9 100644 --- a/src/sliceview/backend_chunk_decoders/png.ts +++ b/src/sliceview/backend_chunk_decoders/png.ts @@ -18,19 +18,18 @@ import { decodePng } from "#src/async_computation/decode_png_request.js"; import { requestAsyncComputation } from "#src/async_computation/request.js"; import { decodeRawChunk } from "#src/sliceview/backend_chunk_decoders/raw.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES } from "#src/util/data_type.js"; export async function decodePngChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, ) { const chunkDataSize = chunk.chunkDataSize!; const dataType = chunk.source!.spec.dataType; const { uint8Array: image } = await requestAsyncComputation( decodePng, - cancellationToken, + signal, [response], /*buffer=*/ new Uint8Array(response), /*width=*/ undefined, @@ -41,5 +40,5 @@ export async function decodePngChunk( /*convertToGrayscale=*/ false, ); - await decodeRawChunk(chunk, cancellationToken, image.buffer); + await decodeRawChunk(chunk, signal, image.buffer); } diff --git a/src/sliceview/backend_chunk_decoders/postprocess.ts b/src/sliceview/backend_chunk_decoders/postprocess.ts index 69efafaca2..23bbf0d89a 100644 --- a/src/sliceview/backend_chunk_decoders/postprocess.ts +++ b/src/sliceview/backend_chunk_decoders/postprocess.ts @@ -25,14 +25,12 @@ import { import { requestAsyncComputation } from "#src/async_computation/request.js"; import { DataType } from "#src/sliceview/base.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; export async function postProcessRawData( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, data: ArrayBufferView, ) { - cancellationToken; const { spec } = chunk.source!; if (spec.compressedSegmentationBlockSize !== undefined) { const { dataType } = spec; @@ -47,7 +45,7 @@ export async function postProcessRawData( case DataType.UINT32: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint32, - cancellationToken, + signal, [data.buffer], data as Uint32Array, shape, @@ -57,7 +55,7 @@ export async function postProcessRawData( case DataType.UINT64: chunk.data = await requestAsyncComputation( encodeCompressedSegmentationUint64, - cancellationToken, + signal, [data.buffer], data as Uint32Array, shape, diff --git a/src/sliceview/backend_chunk_decoders/raw.ts b/src/sliceview/backend_chunk_decoders/raw.ts index 96426f6b98..2a883c16d3 100644 --- a/src/sliceview/backend_chunk_decoders/raw.ts +++ b/src/sliceview/backend_chunk_decoders/raw.ts @@ -16,7 +16,6 @@ import { postProcessRawData } from "#src/sliceview/backend_chunk_decoders/postprocess.js"; import type { VolumeChunk } from "#src/sliceview/volume/backend.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DATA_TYPE_BYTES, makeDataTypeArrayView } from "#src/util/data_type.js"; import type { Endianness } from "#src/util/endian.js"; import { convertEndian, ENDIANNESS } from "#src/util/endian.js"; @@ -24,13 +23,13 @@ import * as vector from "#src/util/vector.js"; export async function decodeRawChunk( chunk: VolumeChunk, - cancellationToken: CancellationToken, + signal: AbortSignal, response: ArrayBuffer, endianness: Endianness = ENDIANNESS, byteOffset = 0, byteLength: number = response.byteLength, ) { - cancellationToken; + signal; const { spec } = chunk.source!; const { dataType } = spec; const numElements = vector.prod(chunk.chunkDataSize!); @@ -49,5 +48,5 @@ export async function decodeRawChunk( byteLength, ); convertEndian(data, endianness, bytesPerElement); - await postProcessRawData(chunk, cancellationToken, data); + await postProcessRawData(chunk, signal, data); } diff --git a/src/sliceview/compressed_segmentation/chunk_format.ts b/src/sliceview/compressed_segmentation/chunk_format.ts index d8e86f39ba..74ea6e518d 100644 --- a/src/sliceview/compressed_segmentation/chunk_format.ts +++ b/src/sliceview/compressed_segmentation/chunk_format.ts @@ -300,7 +300,7 @@ export class CompressedSegmentationVolumeChunk extends SingleTextureVolumeChunk< Uint32Array, TextureLayout > { - CHUNK_FORMAT_TYPE: ChunkFormat; + declare CHUNK_FORMAT_TYPE: ChunkFormat; setTextureData(gl: GL) { const { data } = this; diff --git a/src/sliceview/compressed_segmentation/decode_uint32.ts b/src/sliceview/compressed_segmentation/decode_uint32.ts index 8fa21d13b5..8794469964 100644 --- a/src/sliceview/compressed_segmentation/decode_uint32.ts +++ b/src/sliceview/compressed_segmentation/decode_uint32.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/decode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/decode.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/sliceview/compressed_segmentation/decode_uint64.ts b/src/sliceview/compressed_segmentation/decode_uint64.ts index 76a4b32e6b..329d014cee 100644 --- a/src/sliceview/compressed_segmentation/decode_uint64.ts +++ b/src/sliceview/compressed_segmentation/decode_uint64.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/decode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/decode.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/sliceview/compressed_segmentation/encode.benchmark.ts b/src/sliceview/compressed_segmentation/encode.benchmark.ts index dcd19fbc49..022c72ce66 100644 --- a/src/sliceview/compressed_segmentation/encode.benchmark.ts +++ b/src/sliceview/compressed_segmentation/encode.benchmark.ts @@ -32,7 +32,12 @@ describe("64x64x64 example", async () => { "testdata", ); const exampleChunkDataUint8Array = await fs.readFile( - path.resolve(testDataDir, "64x64x64-raw-uint64-segmentation.dat"), + path.resolve( + testDataDir, + "codec", + "compressed_segmentation", + "64x64x64-raw-uint64-segmentation.dat", + ), ); const exampleChunkData64 = new Uint32Array(exampleChunkDataUint8Array.buffer); const exampleChunkData32 = exampleChunkData64.filter((_element, index) => { diff --git a/src/sliceview/compressed_segmentation/encode_common.ts b/src/sliceview/compressed_segmentation/encode_common.ts index 4cc5bcc3f9..ac283a0e21 100644 --- a/src/sliceview/compressed_segmentation/encode_common.ts +++ b/src/sliceview/compressed_segmentation/encode_common.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode_common.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode_common.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -351,22 +350,22 @@ export function encodeChannel( const curGridSize = (gridSize[i] = Math.ceil(volumeSize[i] / blockSize[i])); blockIndexSize *= curGridSize; } - const gx = gridSize[0]; - const gy = gridSize[1]; - const gz = gridSize[2]; - const xSize = volumeSize[0]; - const ySize = volumeSize[1]; - const zSize = volumeSize[2]; - const xBlockSize = blockSize[0]; - const yBlockSize = blockSize[1]; - const zBlockSize = blockSize[2]; + const gx = gridSize[0], + gy = gridSize[1], + gz = gridSize[2]; + const xSize = volumeSize[0], + ySize = volumeSize[1], + zSize = volumeSize[2]; + const xBlockSize = blockSize[0], + yBlockSize = blockSize[1], + zBlockSize = blockSize[2]; const baseOffset = output.length; let headerOffset = baseOffset; const actualSize = [0, 0, 0]; output.resize(baseOffset + blockIndexSize); - const sx = inputStrides[0]; - const sy = inputStrides[1]; - const sz = inputStrides[2]; + const sx = inputStrides[0], + sy = inputStrides[1], + sz = inputStrides[2]; for (let bz = 0; bz < gz; ++bz) { actualSize[2] = Math.min(zBlockSize, zSize - bz * zBlockSize); for (let by = 0; by < gy; ++by) { diff --git a/src/sliceview/compressed_segmentation/encode_uint32.ts b/src/sliceview/compressed_segmentation/encode_uint32.ts index e5d62e588c..fc868d266d 100644 --- a/src/sliceview/compressed_segmentation/encode_uint32.ts +++ b/src/sliceview/compressed_segmentation/encode_uint32.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -49,15 +48,15 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder, ): [number, number] { - const ax = actualSize[0]; - const ay = actualSize[1]; - const az = actualSize[2]; - const bx = blockSize[0]; - const by = blockSize[1]; - const bz = blockSize[2]; + const ax = actualSize[0], + ay = actualSize[1], + az = actualSize[2]; + const bx = blockSize[0], + by = blockSize[1], + bz = blockSize[2]; const sx = inputStrides[0]; - let sy = inputStrides[1]; - let sz = inputStrides[2]; + let sy = inputStrides[1], + sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { @@ -153,7 +152,7 @@ export function encodeChannel( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 1), ) { return encodeChannelCommon( @@ -172,7 +171,7 @@ export function encodeChannels( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 1), ) { return encodeChannelsCommon( diff --git a/src/sliceview/compressed_segmentation/encode_uint64.ts b/src/sliceview/compressed_segmentation/encode_uint64.ts index b40fd5c84b..e2030d8f73 100644 --- a/src/sliceview/compressed_segmentation/encode_uint64.ts +++ b/src/sliceview/compressed_segmentation/encode_uint64.ts @@ -1,5 +1,4 @@ -// DO NOT EDIT. Generated from -// templates/neuroglancer/sliceview/compressed_segmentation/encode.template.ts. +// DO NOT EDIT. Generated from templates/sliceview/compressed_segmentation/encode.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -49,15 +48,15 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder, ): [number, number] { - const ax = actualSize[0]; - const ay = actualSize[1]; - const az = actualSize[2]; - const bx = blockSize[0]; - const by = blockSize[1]; - const bz = blockSize[2]; + const ax = actualSize[0], + ay = actualSize[1], + az = actualSize[2]; + const bx = blockSize[0], + by = blockSize[1], + bz = blockSize[2]; const sx = inputStrides[0]; - let sy = inputStrides[1]; - let sz = inputStrides[2]; + let sy = inputStrides[1], + sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { @@ -170,7 +169,7 @@ export function encodeChannel( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 2), ) { return encodeChannelCommon( @@ -189,7 +188,7 @@ export function encodeChannels( blockSize: ArrayLike, rawData: Uint32Array, volumeSize: ArrayLike, - baseInputOffset = 0, + baseInputOffset: number = 0, inputStrides = getFortranOrderStrides(volumeSize, 2), ) { return encodeChannelsCommon( diff --git a/src/sliceview/compresso/index.ts b/src/sliceview/compresso/index.ts index 3ab4100a35..b29ba329e7 100644 --- a/src/sliceview/compresso/index.ts +++ b/src/sliceview/compresso/index.ts @@ -75,7 +75,7 @@ function readHeader(buffer: Uint8Array): { export async function decompressCompresso( buffer: Uint8Array, -): Promise { +): Promise> { const m = await getCompressoModulePromise(); const { sx, sy, sz, dataWidth } = readHeader(buffer); diff --git a/src/sliceview/frontend.ts b/src/sliceview/frontend.ts index dd20d2a6b7..4cd15754fd 100644 --- a/src/sliceview/frontend.ts +++ b/src/sliceview/frontend.ts @@ -62,14 +62,13 @@ import { import { ChunkLayout } from "#src/sliceview/chunk_layout.js"; import { SliceViewRenderLayer } from "#src/sliceview/renderlayer.js"; import type { WatchableValueInterface } from "#src/trackable_value.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; import type { Borrowed, Disposer, Owned } from "#src/util/disposable.js"; import { invokeDisposers, RefCounted } from "#src/util/disposable.js"; import type { vec4 } from "#src/util/geom.js"; import { kOneVec, kZeroVec4, mat4, vec3 } from "#src/util/geom.js"; import { MessageList, MessageSeverity } from "#src/util/message_list.js"; import { getObjectId } from "#src/util/object_id.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; import { NullarySignal } from "#src/util/signal.js"; import { withSharedVisibility } from "#src/visibility_priority/frontend.js"; import type { GL } from "#src/webgl/context.js"; @@ -159,10 +158,10 @@ function disposeTransformedSources( @registerSharedObjectOwner(SLICEVIEW_RPC_ID) export class SliceView extends Base { - gl = this.chunkManager.gl; + gl: GL; viewChanged = new NullarySignal(); - rpc: RPC; - rpcId: number; + declare rpc: RPC; + declare rpcId: number; renderingStale = true; @@ -170,22 +169,17 @@ export class SliceView extends Base { visibleLayerList = new Array(); - visibleLayers: Map; + declare visibleLayers: Map; - offscreenFramebuffer = this.registerDisposer( - new FramebufferConfiguration(this.gl, { - colorBuffers: makeTextureBuffers(this.gl, 1), - depthBuffer: new DepthTextureBuffer(this.gl), - }), - ); + offscreenFramebuffer; histogramInputTextures: TextureBuffer[] = []; - offscreenFramebuffersWithHistograms = [this.offscreenFramebuffer]; + offscreenFramebuffersWithHistograms; get displayDimensionRenderInfo() { return this.navigationState.displayDimensionRenderInfo; } - private histogramGenerator = TextureHistogramGenerator.get(this.gl); + private histogramGenerator: TextureHistogramGenerator; computeHistograms( count: number, @@ -200,7 +194,7 @@ export class SliceView extends Base { ); } - projectionParameters: Owned< + declare projectionParameters: Owned< DerivedProjectionParameters >; @@ -276,6 +270,17 @@ export class SliceView extends Base { }, }), ); + this.gl = chunkManager.gl; + + this.offscreenFramebuffer = this.registerDisposer( + new FramebufferConfiguration(this.gl, { + colorBuffers: makeTextureBuffers(this.gl, 1), + depthBuffer: new DepthTextureBuffer(this.gl), + }), + ); + this.offscreenFramebuffersWithHistograms = [this.offscreenFramebuffer]; + this.histogramGenerator = TextureHistogramGenerator.get(this.gl); + this.registerDisposer(navigationState); this.registerDisposer(this.projectionParameters); this.registerDisposer( @@ -408,7 +413,6 @@ export class SliceView extends Base { const { visibleLayers, visibleLayerList } = this; const { displayDimensionRenderInfo } = this.projectionParameters.value; const rpc = this.rpc!; - const rpcMessage: any = { id: this.rpcId }; let changed = false; visibleLayerList.length = 0; for (const renderLayer of this.layerManager.readyRenderLayers()) { @@ -449,20 +453,22 @@ export class SliceView extends Base { layerInfo.displayDimensionRenderInfo = displayDimensionRenderInfo; layerInfo.transformGeneration = curTransformGeneration; } - rpcMessage.layerId = renderLayer.rpcId; - rpcMessage.sources = serializeAllTransformedSources( - layerInfo.allSources, - ); - rpcMessage.displayDimensionRenderInfo = displayDimensionRenderInfo; this.flushBackendProjectionParameters(); - rpc.invoke(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, rpcMessage); + rpc.invoke(SLICEVIEW_ADD_VISIBLE_LAYER_RPC_ID, { + id: this.rpcId, + layerId: renderLayer.rpcId, + sources: serializeAllTransformedSources(layerInfo.allSources), + displayDimensionRenderInfo: displayDimensionRenderInfo, + }); changed = true; } } for (const [renderLayer, layerInfo] of visibleLayers) { if (layerInfo.lastSeenGeneration === curUpdateGeneration) continue; - rpcMessage.layerId = renderLayer.rpcId; - rpc.invoke(SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, rpcMessage); + rpc.invoke(SLICEVIEW_REMOVE_VISIBLE_LAYER_RPC_ID, { + id: this.rpcId, + layerId: renderLayer.rpcId, + }); visibleLayers.delete(renderLayer); disposeTransformedSources(renderLayer, layerInfo.allSources); invokeDisposers(layerInfo.disposers); @@ -605,9 +611,9 @@ export abstract class SliceViewChunkSource< extends ChunkSource implements SliceViewChunkSourceInterface { - chunks: Map; + declare chunks: Map; - OPTIONS: SliceViewChunkSourceOptions; + declare OPTIONS: SliceViewChunkSourceOptions; spec: Spec; @@ -646,7 +652,7 @@ export abstract class SliceViewChunkSource< async fetchChunk( chunkGridPosition: Float32Array, transform: (chunk: Chunk) => T, - cancellationToken: CancellationToken = uncancelableToken, + progressOptions: Partial, ): Promise { const key = chunkGridPosition.join(); const existingChunk = this.chunks.get(key); @@ -675,7 +681,7 @@ export abstract class SliceViewChunkSource< await this.rpc!.promiseInvoke( SLICEVIEW_REQUEST_CHUNK_RPC_ID, { source: this.rpcId, chunkGridPosition }, - cancellationToken, + progressOptions, ); return await promise; } finally { @@ -701,7 +707,7 @@ export interface SliceViewChunkSource { export class SliceViewChunk extends Chunk { chunkGridPosition: vec3; - source: SliceViewChunkSource; + declare source: SliceViewChunkSource; constructor(source: SliceViewChunkSource, x: any) { super(source); @@ -714,7 +720,7 @@ export class SliceViewChunk extends Chunk { * Helper for rendering a SliceView that has been pre-rendered to a texture. */ export class SliceViewRenderHelper extends RefCounted { - private copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); + private copyVertexPositionsBuffer; private shader: ShaderProgram; private textureCoordinateAdjustment = new Float32Array(4); @@ -724,6 +730,8 @@ export class SliceViewRenderHelper extends RefCounted { emitter: ShaderModule, ) { super(); + this.copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); + const builder = new ShaderBuilder(gl); builder.addVarying("vec2", "vTexCoord"); builder.addUniform("sampler2D", "uSampler"); diff --git a/src/sliceview/panel.ts b/src/sliceview/panel.ts index 172ee6f253..bea3bf506c 100644 --- a/src/sliceview/panel.ts +++ b/src/sliceview/panel.ts @@ -100,7 +100,7 @@ const tempVec3b = vec3.create(); const tempVec4 = vec4.create(); export class SliceViewPanel extends RenderedDataPanel { - viewer: SliceViewerState; + declare viewer: SliceViewerState; private axesLineHelper = this.registerDisposer(AxesLineHelper.get(this.gl)); private sliceViewRenderHelper = this.registerDisposer( @@ -435,7 +435,7 @@ export class SliceViewPanel extends RenderedDataPanel { } ensureBoundsUpdated() { - super.ensureBoundsUpdated(); + super.ensureBoundsUpdated(true /* canScaleForScreenshot */); this.sliceView.projectionParameters.setViewport(this.renderViewport); } diff --git a/src/sliceview/png/index.ts b/src/sliceview/png/index.ts index c138aca232..19f039657e 100644 --- a/src/sliceview/png/index.ts +++ b/src/sliceview/png/index.ts @@ -15,6 +15,7 @@ */ import type { DecodedImage } from "#src/async_computation/decode_png_request.js"; +import { transposeArray2d } from "#src/util/array.js"; const libraryEnv = { emscripten_notify_memory_growth: () => {}, @@ -160,7 +161,7 @@ function readHeader(buffer: Uint8Array): { `png: invalid bit depth for grayscale + alpha channel colorspace. Got: ${bitDepth}`, ); } - numChannels = 4; + numChannels = 2; } else { throw new Error(`png: Invalid color space: ${colorSpace}`); } @@ -232,11 +233,16 @@ export async function decompressPng( // Likewise, we reference memory.buffer instead of heap.buffer // because memory growth during decompress could have detached // the buffer. - const image = new Uint8Array( + let image = new Uint8Array( (m.exports.memory as WebAssembly.Memory).buffer, imagePtr, nbytes, ); + + if (numChannels !== 1) { + image = transposeArray2d(image, sx * sy, numChannels); + } + // copy the array so it can be memory managed by JS // and we can free the emscripten buffer return { diff --git a/src/sliceview/renderlayer.ts b/src/sliceview/renderlayer.ts index ad52ba48c1..61c4b2aa57 100644 --- a/src/sliceview/renderlayer.ts +++ b/src/sliceview/renderlayer.ts @@ -52,7 +52,7 @@ import { constantWatchableValue } from "#src/trackable_value.js"; import type { Borrowed } from "#src/util/disposable.js"; import { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import type { ShaderModule } from "#src/webgl/shader.js"; -import type { RpcId, SharedObject } from "#src/worker_rpc.js"; +import type { RpcId } from "#src/worker_rpc.js"; export interface SliceViewRenderLayerOptions { /** @@ -202,7 +202,7 @@ export abstract class SliceViewRenderLayer< ); } - RPC_TYPE_ID: string; + declare RPC_TYPE_ID: string; initializeCounterpart() { const sharedObject = this.registerDisposer( @@ -292,6 +292,4 @@ export class SliceViewPanelRenderLayer< attachment; return true; } - - backend: SharedObject | undefined; } diff --git a/src/sliceview/single_texture_chunk_format.ts b/src/sliceview/single_texture_chunk_format.ts index 4fe03f2737..53468aedfd 100644 --- a/src/sliceview/single_texture_chunk_format.ts +++ b/src/sliceview/single_texture_chunk_format.ts @@ -126,7 +126,7 @@ export abstract class SingleTextureVolumeChunk< texture: WebGLTexture | null = null; data: Data | null; textureLayout: TextureLayout | null; - CHUNK_FORMAT_TYPE: SingleTextureChunkFormat; + declare CHUNK_FORMAT_TYPE: SingleTextureChunkFormat; constructor(source: VolumeChunkSource, x: any) { super(source, x); diff --git a/src/sliceview/uncompressed_chunk_format.browser_test.ts b/src/sliceview/uncompressed_chunk_format.browser_test.ts index 2ee2ade407..132bfa6940 100644 --- a/src/sliceview/uncompressed_chunk_format.browser_test.ts +++ b/src/sliceview/uncompressed_chunk_format.browser_test.ts @@ -59,7 +59,7 @@ describe("sliceview/uncompressed_chunk_format", () => { ]) { const numElements = prod4(volumeSize); for (const [dataType, arrayConstructor] of < - [DataType, TypedArrayConstructor][] + [DataType, TypedArrayConstructor][] >[ [DataType.UINT8, Uint8Array], [DataType.UINT16, Uint16Array], diff --git a/src/sliceview/uncompressed_chunk_format.ts b/src/sliceview/uncompressed_chunk_format.ts index 440e6c28df..e4fc7409ea 100644 --- a/src/sliceview/uncompressed_chunk_format.ts +++ b/src/sliceview/uncompressed_chunk_format.ts @@ -51,7 +51,7 @@ import { class TextureLayout extends RefCounted { strides: Uint32Array; - textureShape = new Uint32Array(this.textureDims); + textureShape: Uint32Array; constructor( gl: GL, public chunkDataSize: Uint32Array, @@ -68,7 +68,9 @@ class TextureLayout extends RefCounted { textureDims === 3 ? gl.max3dTextureSize : gl.maxTextureSize; let textureDim = 0; let textureDimSize = 1; - const { textureShape } = this; + const textureShape = (this.textureShape = new Uint32Array( + this.textureDims, + )); textureShape.fill(1); for (let chunkDim = 0; chunkDim < rank; ++chunkDim) { const size = chunkDataSize[chunkDim]; @@ -284,8 +286,8 @@ export class UncompressedVolumeChunk extends SingleTextureVolumeChunk< Uint8Array, TextureLayout > { - CHUNK_FORMAT_TYPE: ChunkFormat; - source: Source; + declare CHUNK_FORMAT_TYPE: ChunkFormat; + declare source: Source; setTextureData(gl: GL) { const { source } = this; @@ -346,7 +348,9 @@ export function getFillValueArray( dataType: DataType, fillValue: number | Uint64, ) { - const array = new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType]( + const array = new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)( DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT[dataType], ); if (dataType === DataType.UINT64) { diff --git a/src/sliceview/volume/backend.ts b/src/sliceview/volume/backend.ts index 5fe4b79d01..4c7c39b8de 100644 --- a/src/sliceview/volume/backend.ts +++ b/src/sliceview/volume/backend.ts @@ -142,7 +142,7 @@ export class VolumeChunkSource extends SliceViewChunkSourceBackend implements VolumeChunkSourceInterface { - spec: VolumeChunkSpecification; + declare spec: VolumeChunkSpecification; tempChunkDataSize: Uint32Array; tempChunkPosition: Float32Array; constructor(rpc: RPC, options: any) { diff --git a/src/sliceview/volume/frontend.ts b/src/sliceview/volume/frontend.ts index dea825db88..a373b5644a 100644 --- a/src/sliceview/volume/frontend.ts +++ b/src/sliceview/volume/frontend.ts @@ -268,9 +268,9 @@ export class VolumeChunkSource } export abstract class VolumeChunk extends SliceViewChunk { - source: VolumeChunkSource; + declare source: VolumeChunkSource; chunkDataSize: Uint32Array; - CHUNK_FORMAT_TYPE: ChunkFormat; + declare CHUNK_FORMAT_TYPE: ChunkFormat; get chunkFormat(): this["CHUNK_FORMAT_TYPE"] { return this.source.chunkFormat; diff --git a/src/sliceview/volume/renderlayer.ts b/src/sliceview/volume/renderlayer.ts index a01325eb1a..e189483934 100644 --- a/src/sliceview/volume/renderlayer.ts +++ b/src/sliceview/volume/renderlayer.ts @@ -333,7 +333,7 @@ interface ShaderContext { export abstract class SliceViewVolumeRenderLayer< ShaderParameters = any, > extends SliceViewRenderLayer { - multiscaleSource: MultiscaleVolumeChunkSource; + declare multiscaleSource: MultiscaleVolumeChunkSource; protected shaderGetter: ParameterizedContextDependentShaderGetter< { chunkFormat: ChunkFormat | null; dataHistogramsEnabled: boolean }, ShaderParameters, @@ -341,6 +341,7 @@ export abstract class SliceViewVolumeRenderLayer< >; private tempChunkPosition: Float32Array; shaderParameters: WatchableValueInterface; + highestResolutionLoadedVoxelSize: Float32Array | undefined; private vertexIdHelper: VertexIdHelper; constructor( @@ -570,6 +571,7 @@ void main() { this.chunkManager.chunkQueueManager.frameNumberCounter.frameNumber, ); } + this.highestResolutionLoadedVoxelSize = undefined; let shaderResult: ParameterizedShaderGetterResult< ShaderParameters, @@ -692,6 +694,18 @@ void main() { effectiveVoxelSize[1], effectiveVoxelSize[2], ); + if (presentCount > 0) { + const medianStoredVoxelSize = this.highestResolutionLoadedVoxelSize + ? medianOf3( + this.highestResolutionLoadedVoxelSize[0], + this.highestResolutionLoadedVoxelSize[1], + this.highestResolutionLoadedVoxelSize[2], + ) + : Infinity; + if (medianVoxelSize <= medianStoredVoxelSize) { + this.highestResolutionLoadedVoxelSize = effectiveVoxelSize; + } + } renderScaleHistogram.add( medianVoxelSize, medianVoxelSize / projectionParameters.pixelSize, diff --git a/src/sliceview/volume/segmentation_renderlayer.ts b/src/sliceview/volume/segmentation_renderlayer.ts index df09948c83..d2da8376fe 100644 --- a/src/sliceview/volume/segmentation_renderlayer.ts +++ b/src/sliceview/volume/segmentation_renderlayer.ts @@ -25,7 +25,10 @@ import { SegmentStatedColorShaderManager, } from "#src/segment_color.js"; import { getVisibleSegments } from "#src/segmentation_display_state/base.js"; -import type { SegmentationDisplayState } from "#src/segmentation_display_state/frontend.js"; +import type { + SegmentationDisplayState, + SegmentationGroupState, +} from "#src/segmentation_display_state/frontend.js"; import { registerRedrawWhenSegmentationDisplayStateChanged } from "#src/segmentation_display_state/frontend.js"; import type { SliceViewSourceOptions } from "#src/sliceview/base.js"; import type { @@ -88,8 +91,7 @@ const HAS_SELECTED_SEGMENT_FLAG = 1; const SHOW_ALL_SEGMENTS_FLAG = 2; export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer { - public readonly segmentationGroupState = - this.displayState.segmentationGroupState.value; + public readonly segmentationGroupState: SegmentationGroupState; protected segmentColorShaderManager = new SegmentColorShaderManager( "segmentColorHash", ); @@ -99,29 +101,13 @@ export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer | undefined; private hashTableManager = new HashSetShaderManager("visibleSegments"); - private gpuHashTable = this.registerDisposer( - GPUHashTable.get( - this.gl, - this.segmentationGroupState.visibleSegments.hashTable, - ), - ); - private gpuTemporaryHashTable = GPUHashTable.get( - this.gl, - this.segmentationGroupState.temporaryVisibleSegments.hashTable, - ); + private gpuHashTable; + private gpuTemporaryHashTable; private equivalencesShaderManager = new HashMapShaderManager("equivalences"); - private equivalencesHashMap = new EquivalencesHashMap( - this.segmentationGroupState.segmentEquivalences.disjointSets, - ); - private temporaryEquivalencesHashMap = new EquivalencesHashMap( - this.segmentationGroupState.temporarySegmentEquivalences.disjointSets, - ); - private gpuEquivalencesHashTable = this.registerDisposer( - GPUHashTable.get(this.gl, this.equivalencesHashMap.hashMap), - ); - private gpuTemporaryEquivalencesHashTable = this.registerDisposer( - GPUHashTable.get(this.gl, this.temporaryEquivalencesHashMap.hashMap), - ); + private equivalencesHashMap; + private temporaryEquivalencesHashMap; + private gpuEquivalencesHashTable; + private gpuTemporaryEquivalencesHashTable; constructor( multiscaleSource: MultiscaleVolumeChunkSource, @@ -183,6 +169,30 @@ export class SegmentationRenderLayer extends SliceViewVolumeRenderLayer, ); diff --git a/src/status.css b/src/status.css index b0d7b9c850..bf4ab50873 100644 --- a/src/status.css +++ b/src/status.css @@ -14,7 +14,7 @@ * limitations under the License. */ -#statusContainer { +#neuroglancer-status-container { position: absolute; bottom: 0px; z-index: 100; @@ -25,7 +25,7 @@ font: 10pt sans-serif; } -#statusContainer li { +#neuroglancer-status-container li { width: 100vw; max-height: 25vh; overflow-y: auto; @@ -39,7 +39,7 @@ padding: 2px; } -#statusContainerModal { +#neuroglancer-status-container-modal { pointer-events: none; position: absolute; z-index: 100; @@ -57,15 +57,16 @@ grid-row-gap: 10px; } -#statusContainerModal > div { +#neuroglancer-status-container-modal > div { pointer-events: initial; position: relative; background-color: #808080; padding: 20px; padding-top: 30px; + border: 1px solid white; } -#statusContainerModal > div > div:first-child { +#neuroglancer-status-container-modal > div > div:first-child { position: absolute; top: 4px; right: 4px; @@ -73,6 +74,6 @@ padding: 0; } -#statusContainerModal li { +#neuroglancer-status-container-modal li { display: block; } diff --git a/src/status.ts b/src/status.ts index 519df57449..7204ad6601 100644 --- a/src/status.ts +++ b/src/status.ts @@ -18,88 +18,97 @@ import "#src/status.css"; import { makeCloseButton } from "#src/widget/close_button.js"; -let statusContainer: HTMLElement | null = null; -let modalStatusContainer: HTMLElement | null = null; +let statusContainer: HTMLElement | undefined; +let modalStatusContainer: HTMLElement | undefined; + +// Exported for use by #tests/fixtures/status_message_handler.js +export const statusMessages = new Set(); export const DEFAULT_STATUS_DELAY = 200; export type Delay = boolean | number; +function setupStatusContainer(container: HTMLElement) { + container.addEventListener("mousedown", (event) => { + // Prevent focus changes due to clicking on status message. + event.preventDefault(); + }); +} + +function getStatusContainer() { + if (statusContainer === undefined) { + statusContainer = document.createElement("ul"); + setupStatusContainer(statusContainer); + statusContainer.id = "neuroglancer-status-container"; + const el: HTMLElement | null = document.getElementById( + "neuroglancer-container", + ); + if (el) { + el.appendChild(statusContainer); + } else { + document.body.appendChild(statusContainer); + } + } + return statusContainer; +} + +function getModalStatusContainer() { + if (modalStatusContainer === undefined) { + modalStatusContainer = document.createElement("ul"); + setupStatusContainer(modalStatusContainer); + modalStatusContainer.id = "neuroglancer-status-container-modal"; + const el: HTMLElement | null = document.getElementById( + "neuroglancer-container", + ); + if (el) { + el.appendChild(modalStatusContainer); + } else { + document.body.appendChild(modalStatusContainer); + } + } + return modalStatusContainer; +} + +// For use by #tests/fixtures/status_message_handler.js +export function getStatusMessageContainers() { + return [getStatusContainer(), getModalStatusContainer()]; +} + export class StatusMessage { element: HTMLElement; - modalElementWrapper: HTMLElement | undefined; + private modalElementWrapper: HTMLElement | undefined; private timer: number | null; + private visibility = true; constructor(delay: Delay = false, modal = false) { - if (statusContainer === null) { - statusContainer = document.createElement("ul"); - statusContainer.id = "statusContainer"; - const el: HTMLElement | null = document.getElementById( - "neuroglancer-container", - ); - if (el) { - el.appendChild(statusContainer); - } else { - document.body.appendChild(statusContainer); - } - } - if (modal && modalStatusContainer === null) { - modalStatusContainer = document.createElement("ul"); - modalStatusContainer.id = "statusContainerModal"; - const el: HTMLElement | null = document.getElementById( - "neuroglancer-container", - ); - if (el) { - el.appendChild(modalStatusContainer); - } else { - document.body.appendChild(modalStatusContainer); - } - } const element = document.createElement("li"); this.element = element; if (delay === true) { delay = DEFAULT_STATUS_DELAY; } + this.setModal(modal); if (delay !== false) { this.setVisible(false); this.timer = window.setTimeout(this.setVisible.bind(this, true), delay); } else { this.timer = null; } - if (modal) { - const modalElementWrapper = document.createElement("div"); - const dismissModalElement = makeCloseButton({ - title: "Dismiss", - onClick: () => { - this.dismissModal(); - }, - }); - dismissModalElement.classList.add("dismiss-modal"); - dismissModalElement.addEventListener("click", () => this.dismissModal()); - modalElementWrapper.appendChild(dismissModalElement); - modalElementWrapper.appendChild(element); - this.modalElementWrapper = modalElementWrapper; - modalStatusContainer!.appendChild(modalElementWrapper); - } else { - statusContainer.appendChild(element); - } + statusMessages.add(this); + } + + [Symbol.dispose]() { + this.dispose(); } + dispose() { if (this.modalElementWrapper) { modalStatusContainer!.removeChild(this.modalElementWrapper); } else { statusContainer!.removeChild(this.element); } - this.element = undefined; if (this.timer !== null) { clearTimeout(this.timer); } - } - dismissModal() { - if (this.modalElementWrapper) { - modalStatusContainer!.removeChild(this.modalElementWrapper); - this.modalElementWrapper = undefined; - statusContainer!.appendChild(this.element); - } + statusMessages.delete(this); } setText(text: string, makeVisible?: boolean) { this.element.textContent = text; @@ -113,12 +122,52 @@ export class StatusMessage { this.setVisible(true); } } + setModal(value: boolean) { + if (value) { + if (this.modalElementWrapper === undefined) { + const modalElementWrapper = document.createElement("div"); + const dismissModalElement = makeCloseButton({ + title: "Dismiss", + onClick: () => { + this.setModal(false); + }, + }); + dismissModalElement.classList.add("neuroglancer-dismiss-modal"); + modalElementWrapper.appendChild(dismissModalElement); + modalElementWrapper.appendChild(this.element); + this.modalElementWrapper = modalElementWrapper; + this.applyVisibility(); + getModalStatusContainer().appendChild(modalElementWrapper); + } + } else { + if (this.modalElementWrapper !== undefined) { + modalStatusContainer!.removeChild(this.modalElementWrapper); + this.modalElementWrapper = undefined; + getStatusContainer().appendChild(this.element); + } else if (this.element.parentElement === null) { + getStatusContainer().appendChild(this.element); + } + } + } + + private applyVisibility() { + const newVisibility = this.visibility ? "" : "none"; + this.element.style.display = newVisibility; + const { modalElementWrapper } = this; + if (modalElementWrapper !== undefined) { + modalElementWrapper.style.display = newVisibility; + } + } + setVisible(value: boolean) { if (this.timer !== null) { clearTimeout(this.timer); this.timer = null; } - this.element.style.display = value ? "block" : "none"; + if (value !== this.visibility) { + this.visibility = value; + this.applyVisibility(); + } } static forPromise( diff --git a/src/third_party/codemirror-glsl.ts b/src/third_party/codemirror-glsl.ts new file mode 100644 index 0000000000..22271a5e6a --- /dev/null +++ b/src/third_party/codemirror-glsl.ts @@ -0,0 +1,260 @@ +// The following code is derived from https://github.com/hughsk/glsl-editor by +// Hugh Kennedy , subject to the license listed below. +// +// This is a conversion of the original CommonJS module to TypeScript and ESM format. +// +// This software is released under the MIT license: +// +// 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. + +import type CodeMirrorModule from "codemirror"; +import type { EditorConfiguration, Mode, StringStream } from "codemirror"; + +interface Tokenize { + (stream: StringStream, state: State): string; +} + +interface State { + tokenize: Tokenize | null; + context: Context; + indented: number; + startOfLine: boolean; +} + +class Context { + constructor( + public indented: number, + public column: number, + public type: string, + public align: boolean | null, + public prev: Context | undefined = undefined, + ) {} +} + +function glslMode(config: EditorConfiguration, parserConfig: any): Mode { + const indentUnit = config.indentUnit!, + keywords = parserConfig.keywords || words(glslKeywords), + builtins = parserConfig.builtins || words(glslBuiltins), + blockKeywords = + parserConfig.blockKeywords || + words("case do else for if switch while struct"), + atoms = parserConfig.atoms || words("null"), + hooks = parserConfig.hooks || {}, + multiLineStrings = parserConfig.multiLineStrings; + const isOperatorChar = /[+\-*&%=<>!?|/]/; + + let curPunc; + + function tokenBase(stream: StringStream, state: State): string { + const ch = stream.next()!; + if (hooks[ch]) { + const result = hooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } + if (/[[\]{}(),;:.]/.test(ch)) { + curPunc = ch; + return "bracket"; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w.]/); + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + } + if (ch == "#") { + stream.eatWhile(/[\S]+/); + stream.eatWhile(/[\s]+/); + stream.eatWhile(/[\S]+/); + stream.eatWhile(/[\s]+/); + return "comment"; + } + if (isOperatorChar.test(ch)) { + stream.eatWhile(isOperatorChar); + return "operator"; + } + stream.eatWhile(/[\w$_]/); + const cur = stream.current(); + if (Object.hasOwn(keywords, cur)) { + if (Object.hasOwn(blockKeywords, cur)) curPunc = "newstatement"; + return "keyword"; + } + if (Object.hasOwn(builtins, cur)) { + return "builtin"; + } + if (Object.hasOwn(atoms, cur)) return "atom"; + return "word"; + } + + function tokenString(quote: string): Tokenize { + return function (stream: StringStream, state: State) { + let escaped = false, + next, + end = false; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + end = true; + break; + } + escaped = !escaped && next == "\\"; + } + if (end || !(escaped || multiLineStrings)) state.tokenize = tokenBase; + return "string"; + }; + } + + function tokenComment(stream: StringStream, state: State): string { + let maybeEnd = false, + ch; + while ((ch = stream.next())) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = ch == "*"; + } + return "comment"; + } + + function pushContext(state: State, col: number, type: string) { + return (state.context = new Context( + state.indented, + col, + type, + null, + state.context, + )); + } + function popContext(state: State): Context { + const t = state.context.type; + if (t == ")" || t == "]" || t == "}") + state.indented = state.context.indented; + return (state.context = state.context.prev!); + } + + // Interface + + return { + startState: function (basecolumn?: number): State { + return { + tokenize: null, + context: new Context((basecolumn || 0) - indentUnit, 0, "top", false), + indented: 0, + startOfLine: true, + }; + }, + + token: function (stream: StringStream, state: State) { + let ctx = state.context; + if (stream.sol()) { + if (ctx.align == null) ctx.align = false; + state.indented = stream.indentation(); + state.startOfLine = true; + } + if (stream.eatSpace()) return null; + curPunc = null; + const style = (state.tokenize || tokenBase)(stream, state); + if (style == "comment" || style == "meta") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") + popContext(state); + else if (curPunc == "{") pushContext(state, stream.column(), "}"); + else if (curPunc == "[") pushContext(state, stream.column(), "]"); + else if (curPunc == "(") pushContext(state, stream.column(), ")"); + else if (curPunc == "}") { + while (ctx.type == "statement") ctx = popContext(state); + if (ctx.type == "}") ctx = popContext(state); + while (ctx.type == "statement") ctx = popContext(state); + } else if (curPunc == ctx.type) popContext(state); + else if ( + ctx.type == "}" || + ctx.type == "top" || + (ctx.type == "statement" && curPunc == "newstatement") + ) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + return style; + }, + + indent: function (state: State, textAfter: string) { + if (state.tokenize != tokenBase && state.tokenize != null) return 0; + const firstChar = textAfter && textAfter.charAt(0), + ctx = state.context, + closing = firstChar == ctx.type; + if (ctx.type == "statement") + return ctx.indented + (firstChar == "{" ? 0 : indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : indentUnit); + }, + + electricChars: "{}", + }; +} + +function words(str: string): Record { + const obj: Record = {}, + words = str.split(" "); + for (let i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; +} + +const glslKeywords = + "attribute const uniform varying break continue " + + "do for while if else in out inout float int void bool true false " + + "lowp mediump highp precision invariant discard return mat2 mat3 " + + "mat4 vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4 sampler2D " + + "samplerCube struct gl_FragCoord gl_FragColor"; +const glslBuiltins = + "radians degrees sin cos tan asin acos atan pow " + + "exp log exp2 log2 sqrt inversesqrt abs sign floor ceil fract mod " + + "min max clamp mix step smoothstep length distance dot cross " + + "normalize faceforward reflect refract matrixCompMult lessThan " + + "lessThanEqual greaterThan greaterThanEqual equal notEqual any all " + + "not dFdx dFdy fwidth texture2D texture2DProj texture2DLod " + + "texture2DProjLod textureCube textureCubeLod require export"; + +function cppHook(stream: any, state: any) { + if (!state.startOfLine) return false; + stream.skipToEnd(); + return "meta"; +} + +export default function (CodeMirror: typeof CodeMirrorModule) { + CodeMirror.defineMode("glsl", glslMode); + + CodeMirror.defineMIME("text/x-glsl", { + name: "glsl", + keywords: words(glslKeywords), + builtins: words(glslBuiltins), + blockKeywords: words("case do else for if switch while struct"), + atoms: words("null"), + hooks: { "#": cppHook }, + } as any); +} diff --git a/src/third_party/jpgjs/jpg.d.ts b/src/third_party/jpgjs/jpg.d.ts index 91d6ec452a..8439e8b614 100644 --- a/src/third_party/jpgjs/jpg.d.ts +++ b/src/third_party/jpgjs/jpg.d.ts @@ -23,5 +23,9 @@ export class JpegDecoder { height: number; numComponents: number; parse(data: Uint8Array): void; - getData(width: number, height: number, forceRGBOutput?: boolean): Uint8Array; + getData( + width: number, + height: number, + forceRGBOutput?: boolean, + ): Uint8Array; } diff --git a/src/trackable_boolean.ts b/src/trackable_boolean.ts index 2fd2653b49..c6bd7aefa2 100644 --- a/src/trackable_boolean.ts +++ b/src/trackable_boolean.ts @@ -109,12 +109,13 @@ export class TrackableBooleanCheckbox extends RefCounted { } export class ElementVisibilityFromTrackableBoolean extends RefCounted { - private initialDisplay = this.element.style.display; + private initialDisplay: string; constructor( public model: WatchableValueInterface, public element: HTMLElement, ) { super(); + this.initialDisplay = this.element.style.display; this.updateVisibility(); this.registerDisposer( model.changed.add( diff --git a/src/trackable_vec3.ts b/src/trackable_vec3.ts index c220858393..fe233b52af 100644 --- a/src/trackable_vec3.ts +++ b/src/trackable_vec3.ts @@ -48,7 +48,7 @@ export class TrackableVec3 implements Trackable { restoreState(x: any) { try { this.value = verify3dVec(x.split(",")); - } catch (e) { + } catch { this.value = this.defaultValue; } } diff --git a/src/ui/annotations.ts b/src/ui/annotations.ts index c799c90be6..6744105eaf 100644 --- a/src/ui/annotations.ts +++ b/src/ui/annotations.ts @@ -382,6 +382,29 @@ export class AnnotationLayerView extends Tab { ) { super(); this.element.classList.add("neuroglancer-annotation-layer-view"); + this.selectedAnnotationState = makeCachedLazyDerivedWatchableValue( + (selectionState, pin) => { + if (selectionState === undefined) return undefined; + const { layer } = this; + const layerSelectionState = selectionState.layers.find( + (s) => s.layer === layer, + )?.state; + if (layerSelectionState === undefined) return undefined; + const { annotationId } = layerSelectionState; + if (annotationId === undefined) return undefined; + const annotationLayerState = this.annotationStates.states.find( + (x) => + x.sourceIndex === layerSelectionState.annotationSourceIndex && + (layerSelectionState.annotationSubsource === undefined || + x.subsourceId === layerSelectionState.annotationSubsource), + ); + if (annotationLayerState === undefined) return undefined; + return { annotationId, annotationLayerState, pin }; + }, + layer.manager.root.selectionState, + layer.manager.root.selectionState.pin, + ); + this.registerDisposer(this.visibility.changed.add(() => this.updateView())); this.registerDisposer( this.annotationStates.changed.add(() => @@ -530,28 +553,7 @@ export class AnnotationLayerView extends Tab { } } - private selectedAnnotationState = makeCachedLazyDerivedWatchableValue( - (selectionState, pin) => { - if (selectionState === undefined) return undefined; - const { layer } = this; - const layerSelectionState = selectionState.layers.find( - (s) => s.layer === layer, - )?.state; - if (layerSelectionState === undefined) return undefined; - const { annotationId } = layerSelectionState; - if (annotationId === undefined) return undefined; - const annotationLayerState = this.annotationStates.states.find( - (x) => - x.sourceIndex === layerSelectionState.annotationSourceIndex && - (layerSelectionState.annotationSubsource === undefined || - x.subsourceId === layerSelectionState.annotationSubsource), - ); - if (annotationLayerState === undefined) return undefined; - return { annotationId, annotationLayerState, pin }; - }, - this.layer.manager.root.selectionState, - this.layer.manager.root.selectionState.pin, - ); + private selectedAnnotationState; private updateSelectionView() { const selectionState = this.selectedAnnotationState.value; @@ -967,11 +969,13 @@ export class AnnotationLayerView extends Tab { } export class AnnotationTab extends Tab { - private layerView = this.registerDisposer( - new AnnotationLayerView(this.layer, this.layer.annotationDisplayState), - ); + private layerView: AnnotationLayerView; constructor(public layer: Borrowed) { super(); + this.layerView = this.registerDisposer( + new AnnotationLayerView(layer, layer.annotationDisplayState), + ); + const { element } = this; element.classList.add("neuroglancer-annotations-tab"); element.appendChild(this.layerView.element); @@ -1008,7 +1012,7 @@ function getSelectedAssociatedSegments( } abstract class PlaceAnnotationTool extends LegacyTool { - layer: UserLayerWithAnnotations; + declare layer: UserLayerWithAnnotations; constructor(layer: UserLayerWithAnnotations, options: any) { super(layer); options; @@ -1180,7 +1184,7 @@ abstract class TwoStepAnnotationTool extends PlaceAnnotationTool { } abstract class PlaceTwoCornerAnnotationTool extends TwoStepAnnotationTool { - annotationType: + declare annotationType: | AnnotationType.LINE | AnnotationType.AXIS_ALIGNED_BOUNDING_BOX; @@ -2039,6 +2043,7 @@ export function UserLayerWithAnnotationsMixin< subsourceId: subsourceEntry.id, role, }); + this.annotationDisplayState.annotationProperties.value = []; this.addAnnotationLayerState(state, loadedSubsource); } diff --git a/src/ui/default_viewer_setup.ts b/src/ui/default_viewer_setup.ts index fc5d5aeaee..fc6bb1a406 100644 --- a/src/ui/default_viewer_setup.ts +++ b/src/ui/default_viewer_setup.ts @@ -37,7 +37,7 @@ export function setupDefaultViewer(options?: Partial) { const hashBinding = viewer.registerDisposer( new UrlHashBinding( viewer.state, - viewer.dataSourceProvider.credentialsManager, + viewer.dataSourceProvider.sharedKvStoreContext, { defaultFragment: typeof NEUROGLANCER_DEFAULT_STATE_FRAGMENT !== "undefined" diff --git a/src/ui/drag_and_drop.ts b/src/ui/drag_and_drop.ts index 715e53c590..560418d6e2 100644 --- a/src/ui/drag_and_drop.ts +++ b/src/ui/drag_and_drop.ts @@ -28,6 +28,7 @@ const dragStatusStack: { target: EventTarget; operation: DragStatusType; status: DragStatusRenderer; + leaveHandler?: () => void; }[] = []; function getStatusElement() { @@ -46,9 +47,21 @@ function clearStatus() { } } -function applyStatus(status: DragStatusRenderer) { +function applyStatus(event: MouseEvent, status: DragStatusRenderer) { const element = getStatusElement(); removeChildren(element); + if (event.clientX === 0 && event.clientY === 0) { + // Probably an invalid position due to dragging outside the window. + } else { + if (event.clientX < window.innerWidth / 2) { + element.style.left = "auto"; + element.style.right = "0px"; + } else { + element.style.right = "auto"; + element.style.left = "0px"; + } + } + if (typeof status === "string") { element.appendChild(document.createTextNode(status)); } else { @@ -58,23 +71,32 @@ function applyStatus(status: DragStatusRenderer) { } function removeDragStatus(target: EventTarget, operation: DragStatusType) { - filterArrayInplace( - dragStatusStack, - (entry) => !(entry.target === target && entry.operation === operation), - ); + filterArrayInplace(dragStatusStack, (entry) => { + if (entry.target === target && entry.operation === operation) { + entry.leaveHandler?.(); + return false; + } + return true; + }); } export function pushDragStatus( + event: MouseEvent, target: EventTarget, operation: DragStatusType, status: DragStatusRenderer, + leaveHandler?: () => void, ) { removeDragStatus(target, operation); - dragStatusStack.push({ target, operation, status }); - applyStatus(status); + dragStatusStack.push({ target, operation, status, leaveHandler }); + applyStatus(event, status); } -export function popDragStatus(target: EventTarget, operation: DragStatusType) { +export function popDragStatus( + event: MouseEvent, + target: EventTarget, + operation: DragStatusType, +) { removeDragStatus(target, operation); const entry = dragStatusStack.length === 0 @@ -83,6 +105,6 @@ export function popDragStatus(target: EventTarget, operation: DragStatusType) { if (entry === undefined) { clearStatus(); } else { - applyStatus(entry.status); + applyStatus(event, entry.status); } } diff --git a/src/ui/layer_bar.ts b/src/ui/layer_bar.ts index cb6eadeea7..711a77e400 100644 --- a/src/ui/layer_bar.ts +++ b/src/ui/layer_bar.ts @@ -183,16 +183,8 @@ export class LayerBar extends RefCounted { private valueUpdateNeeded = false; dropZone: HTMLDivElement; private layerWidgetInsertionPoint = document.createElement("div"); - private positionWidget = this.registerDisposer( - new PositionWidget( - this.viewerNavigationState.position.value, - this.manager.root.coordinateSpaceCombiner, - { - velocity: this.viewerNavigationState.velocity.velocity, - getToolBinder: () => this.layerGroupViewer.toolBinder, - }, - ), - ); + private positionWidget: PositionWidget; + /** * For use within this module only. */ @@ -226,6 +218,17 @@ export class LayerBar extends RefCounted { public showLayerHoverValues: WatchableValueInterface, ) { super(); + this.positionWidget = this.registerDisposer( + new PositionWidget( + this.viewerNavigationState.position.value, + this.manager.root.coordinateSpaceCombiner, + { + velocity: this.viewerNavigationState.velocity.velocity, + getToolBinder: () => this.layerGroupViewer.toolBinder, + }, + ), + ); + const { element, manager, selectedLayer } = this; element.className = "neuroglancer-layer-panel"; this.registerDisposer( diff --git a/src/ui/layer_data_sources_tab.css b/src/ui/layer_data_sources_tab.css index 0fa84d0b20..f72fe24c2e 100644 --- a/src/ui/layer_data_sources_tab.css +++ b/src/ui/layer_data_sources_tab.css @@ -112,3 +112,13 @@ li.neuroglancer-message-info { .neuroglancer-layer-data-sources-tab-type-detection-type { font-weight: bold; } + +.neuroglancer-layer-data-sources-tab .neuroglancer-progress { + margin: 0px; + list-style: none; + padding: 0px; +} + +.neuroglancer-layer-data-sources-tab .neuroglancer-progress > li { + color: #ccc; +} diff --git a/src/ui/layer_data_sources_tab.ts b/src/ui/layer_data_sources_tab.ts index 5174f9209b..866acd4850 100644 --- a/src/ui/layer_data_sources_tab.ts +++ b/src/ui/layer_data_sources_tab.ts @@ -19,7 +19,7 @@ */ import "#src/ui/layer_data_sources_tab.css"; -import { LocalDataSource } from "#src/datasource/index.js"; +import { LocalDataSource } from "#src/datasource/local.js"; import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; import { changeLayerName, @@ -40,7 +40,6 @@ import type { WatchableValueInterface } from "#src/trackable_value.js"; import { WatchableValue } from "#src/trackable_value.js"; import type { DebouncedFunction } from "#src/util/animation_frame_debounce.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { DataType } from "#src/util/data_type.js"; import type { Borrowed } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -51,36 +50,62 @@ import { } from "#src/util/dom.js"; import type { MessageList } from "#src/util/message_list.js"; import { MessageSeverity } from "#src/util/message_list.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; import { makeAddButton } from "#src/widget/add_button.js"; import { CoordinateSpaceTransformWidget } from "#src/widget/coordinate_transform.js"; +import type { + Completer, + SyntaxHighlighter, +} from "#src/widget/multiline_autocomplete.js"; import { AutocompleteTextInput, makeCompletionElementWithDescription, } from "#src/widget/multiline_autocomplete.js"; +import { ProgressListenerWidget } from "#src/widget/progress_listener.js"; import { Tab } from "#src/widget/tab_view.js"; +const dataSourceUrlSyntaxHighlighter: SyntaxHighlighter = { + splitPattern: /\|?[^|:/_]*(?:[:/_]+)?/g, + getSeparatorNode: (text: string) => { + if (text.startsWith("|") && text.length > 1) { + // Create an empty span with CSS class that adds `::after` node with + // content "\a". This prevents the linebreak from affecting text selection. + const node = document.createElement("span"); + node.classList.add("neuroglancer-multiline-autocomplete-linebreak"); + return node; + } else { + return document.createElement("wbr"); + } + }, +}; + class SourceUrlAutocomplete extends AutocompleteTextInput { dataSourceView: DataSourceView; dirty: WatchableValueInterface; constructor(dataSourceView: DataSourceView) { const { manager } = dataSourceView.source.layer; - const sourceCompleter = ( - value: string, - cancellationToken: CancellationToken, - ) => - manager.dataSourceProviderRegistry - .completeUrl({ + const sourceCompleter: Completer = async ( + { value }, + signal: AbortSignal, + progressListener: ProgressListener, + ) => { + const originalResult = + await manager.dataSourceProviderRegistry.completeUrl({ url: value, - chunkManager: manager.chunkManager, - cancellationToken, - }) - .then((originalResult) => ({ - completions: originalResult.completions, - makeElement: makeCompletionElementWithDescription, - offset: originalResult.offset, - showSingleResult: true, - })); - super({ completer: sourceCompleter, delay: 0 }); + signal, + progressListener, + }); + return { + ...originalResult, + makeElement: makeCompletionElementWithDescription, + showSingleResult: true, + }; + }; + super({ + completer: sourceCompleter, + syntaxHighlighter: dataSourceUrlSyntaxHighlighter, + delay: 0, + }); this.placeholder = "Data source URL"; this.dataSourceView = dataSourceView; this.element.classList.add("neuroglancer-layer-data-source-url-input"); @@ -309,14 +334,6 @@ export class DataSourceView extends RefCounted { const { source } = this; const existingSpec = source.spec; const userLayer = this.source.layer; - url = userLayer.manager.dataSourceProviderRegistry.normalizeUrl({ url }); - if (url !== urlInput.value) { - urlInput.disableCompletion(); - urlInput.setValueAndSelection(url, { - begin: url.length, - end: url.length, - }); - } urlInput.dirty.value = false; // If url is non-empty and unchanged, don't set spec, as that would trigger a reload of the // data source. If the url is empty, always set spec in order to possible remove the empty @@ -333,12 +350,14 @@ export class DataSourceView extends RefCounted { try { const newName = userLayer.manager.dataSourceProviderRegistry.suggestLayerName(url); - changeLayerName(userLayer.managedLayer, newName); + if (newName) { + changeLayerName(userLayer.managedLayer, newName); + } } catch { // Ignore errors obtaining a suggested layer name. } } - source.spec = { ...existingSpec, url }; + source.spec = { ...existingSpec, url, setManually: true }; }; urlInput.onCommit.add(updateUrlFromView); @@ -348,6 +367,12 @@ export class DataSourceView extends RefCounted { element.appendChild( this.registerDisposer(new MessagesView(source.messages)).element, ); + const progressListenerWidget = new ProgressListenerWidget(); + element.appendChild(progressListenerWidget.element); + source.progressListener.addListener(progressListenerWidget); + this.registerDisposer(() => + source.progressListener.removeListener(progressListenerWidget), + ); this.updateView(); } diff --git a/src/ui/layer_drag_and_drop.ts b/src/ui/layer_drag_and_drop.ts index fb6f87d9dc..4c3867e671 100644 --- a/src/ui/layer_drag_and_drop.ts +++ b/src/ui/layer_drag_and_drop.ts @@ -26,6 +26,7 @@ import { decodeParametersFromDragTypeList, encodeParametersAsDragType, getDropEffect, + getDropEffectFromModifiers, setDropEffect, } from "#src/util/drag_and_drop.js"; import { @@ -228,42 +229,6 @@ export class DropLayers { type LayerDropEffect = "none" | "move" | "copy" | "link"; -export function getDropEffectFromModifiers( - event: DragEvent, - defaultDropEffect: DropEffect, - moveAllowed: boolean, -): { dropEffect: DropEffect | "move" | "copy"; dropEffectMessage: string } { - let dropEffect: DropEffect | "move" | "copy"; - if (event.shiftKey) { - dropEffect = "copy"; - } else if (event.ctrlKey && moveAllowed) { - dropEffect = "move"; - } else { - dropEffect = defaultDropEffect; - } - let message = ""; - const addMessage = (msg: string) => { - if (message !== "") { - message += ", "; - } - message += msg; - }; - if (defaultDropEffect !== "none" && dropEffect !== defaultDropEffect) { - if (event.shiftKey) { - addMessage(`release SHIFT to ${defaultDropEffect}`); - } else { - addMessage(`release CONTROL to ${defaultDropEffect}`); - } - } - if (dropEffect !== "copy") { - addMessage("hold SHIFT to copy"); - } - if (dropEffect !== "move" && moveAllowed && defaultDropEffect !== "move") { - addMessage("hold CONTROL to move"); - } - return { dropEffect, dropEffectMessage: message }; -} - export function getLayerDropEffect( event: DragEvent, manager: Borrowed, @@ -523,13 +488,13 @@ export function registerLayerBarDropHandlers( if (update(event, /*updateDropEffect=*/ true) !== undefined) { event.preventDefault(); } else { - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); } }); target.addEventListener("drop", (event: DragEvent) => { event.preventDefault(); panel.dragEnterCount = 0; - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); const dropLayers = update(event, /*updateDropEffect=*/ false)?.dropLayers; panel.dropLayers = undefined; if (dropLayers === undefined) return; @@ -545,7 +510,7 @@ export function registerLayerBarDropHandlers( target.addEventListener("dragover", (event: DragEvent) => { const updateResult = update(event, /*updateDropEffect=*/ true); if (updateResult === undefined) { - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); return; } const { dropLayers, dropEffect, dropEffectMessage } = updateResult; @@ -565,7 +530,7 @@ export function registerLayerBarDropHandlers( if (dropEffectMessage) { message += ` (${dropEffectMessage})`; } - pushDragStatus(panel.element, "drop", message); + pushDragStatus(event, panel.element, "drop", message); event.preventDefault(); event.stopPropagation(); }); @@ -580,6 +545,7 @@ export function registerLayerDragHandlers( element.draggable = true; element.addEventListener("dragstart", (event: DragEvent) => { pushDragStatus( + event, element, "drag", "Drag layer to another layer bar/panel (including in another Neuroglancer window), " + @@ -593,8 +559,8 @@ export function registerLayerDragHandlers( }); event.stopPropagation(); }); - element.addEventListener("dragend", () => { - popDragStatus(element, "drag"); + element.addEventListener("dragend", (event) => { + popDragStatus(event, element, "drag"); // This call to endLayerDrag is a no-op if a drag was completed successfully within the same // browser window, because it will already have been called by the `drop` handler. This call // has an effect only for a cancelled drag or a successful cross-browser window drag. @@ -610,9 +576,9 @@ export function registerLayerBarDragLeaveHandler(panel: LayerBarDropInterface) { panel.element.addEventListener("dragenter", () => { ++panel.dragEnterCount; }); - panel.element.addEventListener("dragleave", () => { + panel.element.addEventListener("dragleave", (event) => { if (--panel.dragEnterCount !== 0) return; - popDragStatus(panel.element, "drop"); + popDragStatus(event, panel.element, "drop"); const { dropLayers } = panel; if (dropLayers !== undefined) { destroyDropLayers(dropLayers); diff --git a/src/ui/layer_list_panel.css b/src/ui/layer_list_panel.css index ecdb04f79b..095c67b0ec 100644 --- a/src/ui/layer_list_panel.css +++ b/src/ui/layer_list_panel.css @@ -11,9 +11,24 @@ .neuroglancer-layer-list-panel-item { display: flex; flex-direction: row; - padding: 2px; + padding: 2px 4px; border: 1px solid #aaa; margin: 2px; + align-items: center; + gap: 0px 2px; +} + +.neuroglancer-layer-list-panel-item input[type="checkbox"] { + width: 1rem; + height: 1rem; +} + +.neuroglancer-layer-list-panel-eye-icon { + width: 20px; + height: 20px; + margin: 0; + padding: 0; + display: flex; } .neuroglancer-layer-list-panel-item[data-selected="true"] { @@ -25,7 +40,9 @@ } .neuroglancer-layer-list-panel-item[data-archived="true"] - .neuroglancer-layer-side-panel-name, + .neuroglancer-layer-list-panel-item-name, +.neuroglancer-layer-list-panel-item[data-archived="true"] + .neuroglancer-layer-type-indicator, .neuroglancer-layer-list-panel-item[data-archived="true"] .neuroglancer-icon svg { @@ -33,16 +50,23 @@ stroke: #999; } +.neuroglancer-layer-list-panel-item-name { + line-height: 20px; + padding: 0; + margin-left: 4px; +} + .neuroglancer-layer-list-panel-item:hover { background-color: #333; } .neuroglancer-layer-list-panel-item-number { font-family: sans-serif; - background-color: var(--layer-number-color); color: white; font-weight: bold; display: inline-block; + text-align: right; + line-height: 18px; } .neuroglancer-layer-list-panel-item:not(:hover) diff --git a/src/ui/layer_list_panel.ts b/src/ui/layer_list_panel.ts index d3251143b8..197f6cc392 100644 --- a/src/ui/layer_list_panel.ts +++ b/src/ui/layer_list_panel.ts @@ -47,6 +47,7 @@ import type { Trackable } from "#src/util/trackable.js"; import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; import { makeDeleteButton } from "#src/widget/delete_button.js"; import { makeIcon } from "#src/widget/icon.js"; +import { LayerTypeIndicatorWidget } from "#src/widget/layer_type_indicator.js"; const DEFAULT_LAYER_LIST_PANEL_LOCATION: SidePanelLocation = { ...DEFAULT_SIDE_PANEL_LOCATION, @@ -72,7 +73,7 @@ export class LayerListPanelState implements Trackable { } } -class LayerVisibilityWidget extends RefCounted { +export class LayerVisibilityWidget extends RefCounted { element = document.createElement("div"); constructor(public layer: ManagedUserLayer) { super(); @@ -91,6 +92,8 @@ class LayerVisibilityWidget extends RefCounted { this.layer.setVisible(true); }, }); + hideIcon.classList.add("neuroglancer-layer-list-panel-eye-icon"); + showIcon.classList.add("neuroglancer-layer-list-panel-eye-icon"); element.appendChild(showIcon); element.appendChild(hideIcon); const updateView = () => { @@ -143,6 +146,10 @@ class LayerListItem extends RefCounted { const { element, numberElement } = this; element.classList.add("neuroglancer-layer-list-panel-item"); numberElement.classList.add("neuroglancer-layer-list-panel-item-number"); + const layerNameWidget = this.registerDisposer(new LayerNameWidget(layer)); + layerNameWidget.element.classList.add( + "neuroglancer-layer-list-panel-item-name", + ); element.appendChild( this.registerDisposer( new TrackableBooleanCheckbox( @@ -167,9 +174,8 @@ class LayerListItem extends RefCounted { element.appendChild( this.registerDisposer(new LayerVisibilityWidget(layer)).element, ); - element.appendChild( - this.registerDisposer(new LayerNameWidget(layer)).element, - ); + element.appendChild(new LayerTypeIndicatorWidget(layer).element); + element.appendChild(layerNameWidget.element); element.appendChild( this.registerDisposer(makeSelectedLayerSidePanelCheckboxIcon(layer)) .element, diff --git a/src/ui/layer_side_panel.ts b/src/ui/layer_side_panel.ts index 56136d6af1..86a1536d3b 100644 --- a/src/ui/layer_side_panel.ts +++ b/src/ui/layer_side_panel.ts @@ -250,8 +250,6 @@ class LayerSidePanel extends SidePanel { handleTabElement: (id: string, element: HTMLElement) => { element.draggable = true; element.addEventListener("dragstart", (event: DragEvent) => { - event.stopPropagation(); - event.dataTransfer!.setData("neuroglancer-side-panel", ""); let message = "Drag tab to dock as new panel to the left/right/top/bottom of another panel"; const hasOtherPanel = panelState.panels.panels.find( @@ -262,7 +260,7 @@ class LayerSidePanel extends SidePanel { layer.managedLayer.name, )} panel`; } - pushDragStatus(element, "drag", message); + pushDragStatus(event, element, "drag", message); this.sidePanelManager.startDrag( { dropAsNewPanel: (location) => { @@ -271,6 +269,10 @@ class LayerSidePanel extends SidePanel { ...location, }); }, + getNewPanelDropEffect: () => ({ + description: "tab", + dropEffect: "move", + }), canDropAsTabs: (target) => { if ( target instanceof LayerSidePanel && @@ -292,8 +294,7 @@ class LayerSidePanel extends SidePanel { ); }); element.addEventListener("dragend", (event: DragEvent) => { - event; - popDragStatus(element, "drag"); + popDragStatus(event, element, "drag"); this.sidePanelManager.endDrag(); }); }, @@ -352,14 +353,15 @@ class LayerSidePanel extends SidePanel { if (!numTabs) return; element.classList.add(DRAG_OVER_CLASSNAME); pushDragStatus( + event, element, "drop", `Move ${numTabs} ${numTabs === 1 ? "tab" : "tabs"} to this panel`, ); event.preventDefault(); }); - element.addEventListener("dragleave", () => { - popDragStatus(element, "drop"); + element.addEventListener("dragleave", (event) => { + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); }); element.addEventListener("dragover", (event) => { @@ -368,7 +370,7 @@ class LayerSidePanel extends SidePanel { event.preventDefault(); }); element.addEventListener("drop", (event) => { - popDragStatus(element, "drop"); + popDragStatus(event, element, "drop"); const { dragSource } = this.sidePanelManager; if (!dragSource?.canDropAsTabs?.(this)) return; element.classList.remove(DRAG_OVER_CLASSNAME); diff --git a/src/ui/layer_side_panel_state.ts b/src/ui/layer_side_panel_state.ts index 1f60e08ae9..79b8c591c3 100644 --- a/src/ui/layer_side_panel_state.ts +++ b/src/ui/layer_side_panel_state.ts @@ -47,10 +47,11 @@ export const LAYER_SIDE_PANEL_DEFAULT_LOCATION = { }; export class UserLayerSidePanelState extends RefCounted { - layer = this.panels.layer; + layer: UserLayer; location = new TrackableSidePanelLocation(LAYER_SIDE_PANEL_DEFAULT_LOCATION); constructor(public panels: UserLayerSidePanelsState) { super(); + this.layer = this.panels.layer; } initialize() { diff --git a/src/ui/screenshot_menu.css b/src/ui/screenshot_menu.css new file mode 100644 index 0000000000..98ecb1e831 --- /dev/null +++ b/src/ui/screenshot_menu.css @@ -0,0 +1,373 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Color variables for the screenshot */ +.neuroglancer-screenshot-overlay { + --gray300: #d0d5dd; + --gray600: #141415; + --gray500: #f7f7f7; + --gray50: #e6e6e6; + --gray800: #344054; + --gray700: rgba(20, 20, 21, 0.6); + --gray400: rgba(20, 20, 21, 0.4); + --gray200: rgba(20, 20, 21, 0.8); + --primary500: #0069eb; + --primary700: #0474ff; +} + +/* General headings, labels, and top-level containers */ +.neuroglancer-screenshot-overlay :is(div, table, tr, td, th) { + box-sizing: border-box; + outline: 0; +} + +.neuroglancer-screenshot-dialog { + width: 48.75rem; + padding: 0; + margin: 1.25rem auto; + position: relative; + transform: none; + left: auto; + top: auto; + border-radius: 0.5rem; + font-family: sans-serif; +} + +.neuroglancer-screenshot-main-body-container { + height: auto; + max-height: calc(100vh - 200px); + overflow-y: auto; + overflow-x: hidden; +} + +.neuroglancer-screenshot-title { + font-size: 0.938rem; + font-weight: 590; + color: var(--gray600); + margin: 0; +} + +.neuroglancer-screenshot-title-subheading { + display: flex; + align-items: center; + justify-content: space-between; +} + +.neuroglancer-screenshot-label { + font-size: 0.813rem; + color: var(--gray200); + font-weight: 590; +} + +/* Div at the top which contains the close */ +.neuroglancer-screenshot-close { + border-bottom: 1px solid var(--gray50); + display: flex; + align-items: center; + padding: 0.75rem 1rem; + gap: 10px; +} + +/* Filename input menu */ +.neuroglancer-screenshot-filename-container { + padding: 1rem 1rem 0.75rem 1rem; +} + +.neuroglancer-screenshot-name-label { + color: var(--gray800); + font-style: normal; + display: block; + margin: 0.75rem 0 0.375rem; +} + +.neuroglancer-screenshot-name-input { + width: 100%; + margin-right: 10px; + border-radius: 8px; + border: 1px solid var(--gray300); + background: white; + font-size: 0.813rem; + font-style: normal; + padding: 8px 12px; + align-items: center; + gap: 8px; + font-weight: 400; + color: var(--gray700); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + line-height: 20px; + box-sizing: border-box; + outline: 0; +} + +.neuroglancer-screenshot-name-input:disabled { + background: var(--gray500); + color: var(--gray400); +} + +.neuroglancer-screenshot-name-input::placeholder { + color: var(--gray700); +} + +/* Scale selection menu */ +.neuroglancer-screenshot-scale-factor-label { + width: 100%; + margin-bottom: 0.5rem; + display: flex; + align-items: center; + gap: 0.15rem; +} + +.neuroglancer-screenshot-scale-menu { + padding: 0 1rem; + display: flex; + flex-wrap: wrap; +} + +.neuroglancer-screenshot-scale-radio-container { + display: flex; + flex-direction: row; +} + +.neuroglancer-screenshot-scale-radio-item { + margin-right: 2.125rem; +} + +.neuroglancer-screenshot-scale-radio-label { + color: var(--gray700); + font-size: 0.75rem; +} + +.neuroglancer-screenshot-scale-radio-input { + margin: 0 0.188rem 0 0; + display: inline-block; + cursor: pointer; +} + +.neuroglancer-screenshot-warning { + color: red; + width: auto; + font-size: 0.75rem; + margin: 0.12rem 0 0 -1.25rem; +} + +/* Slice FOV fixed selection menu */ +.neuroglancer-screenshot-keep-slice-fov-checkbox { + margin: 0; +} + +.neuroglancer-screenshot-keep-slice-label { + display: flex; + flex-direction: row-reverse; + margin: 1rem 0; + width: 100%; + justify-content: flex-end; + align-items: center; + gap: 0.5rem; +} + +/* Take screenshot and close buttons */ +.neuroglancer-screenshot-button { + cursor: pointer; + margin: 2px 0px; + padding: 0; +} + +.neuroglancer-screenshot-close-button { + margin-left: auto; + background-color: transparent; + border: 0; +} + +/* Screenshot resolution table - voxel resolution, panel resolution */ +.neuroglancer-screenshot-size-text { + margin: 0.75rem 0 0.75rem 0; + display: flex; + align-items: center; +} + +.neuroglancer-screenshot-resolution-size-label { + text-align: left; + color: var(--gray200); + font-size: 0.813rem; + font-style: normal; + font-weight: 590; + width: 33.33%; + padding: 0; + margin: 0 0; +} + +.neuroglancer-screenshot-resolution-size-value { + font-size: 0.813rem; + color: var(--gray700); + width: 33.33%; + padding: 0.25rem; + font-weight: 400; +} + +.neuroglancer-screenshot-resolution-preview-container { + border-top: 1px solid var(--gray50); + border-bottom: 1px solid var(--gray50); + background: var(--gray500); + width: 100%; + padding: 1rem 1rem 0.5rem 1rem; +} + +.neuroglancer-screenshot-resolution-table { + width: 100%; + border-collapse: separate; + border-spacing: 0; + padding: 4px 2px 2px 2px; + background-color: var(--gray50); + margin-bottom: 0.75rem; + border-radius: 0.35rem; + border: 0; +} + +.neuroglancer-screenshot-resolution-table th { + font-size: 0.813rem; + width: 33.33%; + text-align: left; + color: var(--gray200); + font-style: normal; + font-weight: 590; + background: var(--gray50); + padding: 0.25rem 0.375rem; +} + +.neuroglancer-screenshot-resolution-table td { + font-size: 0.813rem; + width: 33.33%; + color: var(--gray700); + background: white; + padding: 0.375rem; + line-height: 1.25rem; +} + +.neuroglancer-screenshot-resolution-table-tooltip { + vertical-align: top; + margin-left: 0.25rem; +} + +.neuroglancer-screenshot-copy-icon { + outline: 0; + border: 0; + cursor: pointer; + height: 1rem; + margin-left: auto; + position: relative; + width: 33.33%; + justify-content: flex-end; +} + +.neuroglancer-screenshot-dimension { + color: var(--gray600); +} + +/* Screenshot statistics table - shows GPU memory etc. */ +.neuroglancer-screenshot-statistics-table { + width: 100%; + border-collapse: collapse; +} + +.neuroglancer-screenshot-statistics-table th { + text-align: left; + width: 33.33%; + padding: 0 0 0.5rem; +} + +.neuroglancer-screenshot-statistics-table td { + text-align: left; + width: 33.33%; + font-size: 0.813rem; + padding: 0.5rem 0; +} + +.neuroglancer-screenshot-statistics-table-data-key { + color: var(--gray200); + font-weight: 590; +} + +.neuroglancer-screenshot-statistics-table-data-value { + color: var(--gray700); + font-weight: 400; +} + +.neuroglancer-statistics-table-description-header { + font-size: 0.813rem; + color: var(--gray700); + line-height: 1.25rem; + font-weight: 400; +} + +.neuroglancer-statistics-table-description-link { + font-weight: 590; + cursor: pointer; + color: var(--primary500); + margin-left: 0.1rem; +} + +/* Icons in the dialog */ +.neuroglancer-screenshot-dialog .neuroglancer-icon svg { + stroke: rgba(20, 20, 21, 0.4); + width: 1rem; + height: 1rem; +} + +.neuroglancer-screenshot-dialog .neuroglancer-icon { + width: 1rem; + height: 1rem; + min-width: inherit; + min-height: inherit; + padding: 0; +} + +.neuroglancer-screenshot-dialog .neuroglancer-icon:hover { + background: none; +} + +/* Footer with progress and buttons */ +.neuroglancer-screenshot-footer-container { + margin: 0; + display: flex; + padding: 0.75rem 1rem; + border-top: 1px solid var(--gray50); +} + +.neuroglancer-screenshot-progress-text { + margin: 0; + flex: 1; + font-weight: 590; + cursor: pointer; + padding: 0; + font-size: 0.813rem; + align-self: center; + color: var(--primary700); +} + +.neuroglancer-screenshot-footer-button { + border-radius: 0.5rem; + border: 1px solid var(--gray300); + background: white; + padding: 0.5rem 0.75rem; + font-size: 0.813rem; + font-weight: 590; + color: var(--gray800); + margin: 0 0 0 0.25rem; +} + +.neuroglancer-screenshot-footer-button:disabled { + display: none; +} diff --git a/src/ui/screenshot_menu.ts b/src/ui/screenshot_menu.ts new file mode 100644 index 0000000000..447f761864 --- /dev/null +++ b/src/ui/screenshot_menu.ts @@ -0,0 +1,857 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file UI menu for taking screenshots from the viewer. + */ + +import "#src/ui/screenshot_menu.css"; +import svg_close from "ikonate/icons/close.svg?raw"; +import svg_help from "ikonate/icons/help.svg?raw"; +import { throttle } from "lodash-es"; +import { Overlay } from "#src/overlay.js"; +import { StatusMessage } from "#src/status.js"; +import { setClipboard } from "#src/util/clipboard.js"; +import type { + ScreenshotLoadStatistics, + ScreenshotManager, +} from "#src/util/screenshot_manager.js"; +import { MAX_RENDER_AREA_PIXELS } from "#src/util/screenshot_manager.js"; +import { ScreenshotMode } from "#src/util/trackable_screenshot_mode.js"; +import type { + DimensionResolutionStats, + PanelViewport, +} from "#src/util/viewer_resolution_stats.js"; +import { + getViewerResolutionMetadata, + getViewerLayerResolutions, + getViewerPanelResolutions, +} from "#src/util/viewer_resolution_stats.js"; +import { makeCopyButton } from "#src/widget/copy_button.js"; +import { makeIcon } from "#src/widget/icon.js"; + +// If DEBUG_ALLOW_MENU_CLOSE is true, the menu can be closed by clicking the close button +// Usually the user is locked into the screenshot menu until the screenshot is taken or cancelled +// Setting this to true, and setting the SCREENSHOT_MENU_CLOSE_TIMEOUT in screenshot_manager.ts +// to a high value can be useful for debugging canvas handling of the resize +// Also helpful for viewing the canvas at higher resolutions +const DEBUG_ALLOW_MENU_CLOSE = false; + +// For easy access to UI elements +const PANEL_TABLE_HEADER_STRINGS = { + type: "Panel type", + pixelResolution: "Pixel resolution", + physicalResolution: "Physical scale", +}; +const LAYER_TABLE_HEADER_STRINGS = { + name: "Layer name", + type: "Data type", + resolution: "Physical voxel resolution", +}; +const TOOLTIPS = { + generalSettingsTooltip: + "In the main viewer, see the settings (cog icon, top right) for options to turn off the axis line indicators, the scale bar, and the default annotation yellow bounding box.", + orthographicSettingsTooltip: + "In the main viewer, press 'o' to toggle between perspective and orthographic views.", + layerDataTooltip: + "The highest loaded resolution of 2D image slices, 3D volume renderings, and 2D segmentation slices are shown here. Other layers are not shown.", + scaleFactorHelpTooltip: + "Adjusting the scale will zoom out 2D cross-section panels by that factor unless the box is ticked to keep the slice FOV fixed with scale changes. 3D panels always have fixed FOV regardless of the scale factor.", +}; + +interface UIScreenshotStatistics { + chunkUsageDescription: string; + gpuMemoryUsageDescription: string; + downloadSpeedDescription: string; +} + +const statisticsNamesForUI = { + chunkUsageDescription: "Number of loaded chunks", + gpuMemoryUsageDescription: "Visible chunk GPU memory usage", + downloadSpeedDescription: "Number of downloading chunks", +}; + +const layerNamesForUI = { + ImageRenderLayer: "Image slice (2D)", + VolumeRenderingRenderLayer: "Volume rendering (3D)", + SegmentationRenderLayer: "Segmentation slice (2D)", +}; + +function splitIntoLines(text: string, maxLineLength: number = 60): string { + const words = text.split(" "); + const lines = []; + let currentLine = ""; + + for (const word of words) { + if ((currentLine + word).length > maxLineLength) { + lines.push(currentLine.trim()); + currentLine = word + " "; + } else { + currentLine += word + " "; + } + } + lines.push(currentLine.trim()); + + return lines.join("\n"); +} + +/** + * Combine the resolution of all dimensions into a single string for UI display + */ +function formatPhysicalResolution(resolution: DimensionResolutionStats[]) { + if (resolution.length === 0) { + return { + type: "Loading...", + resolution: "Data not loaded", + }; + } + + const firstResolution = resolution[0]; + const type = firstResolution.panelType; + + if (firstResolution.dimensionName === "All_") { + return { + type, + resolution: firstResolution.resolutionWithUnit, + }; + } + + const resolutionHtml = resolution + .map( + (res) => + `${res.dimensionName} ${res.resolutionWithUnit}`, + ) + .join(" "); + + return { + type, + resolution: resolutionHtml, + }; +} + +function formatPixelResolution(panelArea: PanelViewport) { + const width = Math.round(panelArea.right - panelArea.left); + const height = Math.round(panelArea.bottom - panelArea.top); + const type = panelArea.panelType; + return { width, height, type }; +} + +/** + * This menu allows the user to take a screenshot of the current view, with options to + * set the filename, scale, and force the screenshot to be taken immediately. + * Once a screenshot is initiated, the user is locked into the menu until the + * screenshot is taken or cancelled, to prevent + * the user from interacting with the viewer while the screenshot is being taken. + * + * The menu displays statistics about the current view, such as the number of loaded + * chunks, GPU memory usage, and download speed. These are to inform the user about the + * progress of the screenshot, as it may take some time to load all the data. + * + * The menu also displays the resolution of each panel in the viewer, as well as the resolution + * of the voxels loaded for each Image, Volume, and Segmentation layer. + * This is to inform the user about the the physical units of the data and panels, + * and to help them decide on the scale of the screenshot. + * + * The screenshot menu supports keeping the slice view FOV fixed when changing the scale of the screenshot. + * This will cause the viewer to zoom in or out to keep the same FOV in the slice view. + * For example, an x2 scale will cause the viewer in slice views to zoom in by a factor of 2 + * such that when the number of pixels in the slice view is doubled, the FOV remains the same. + */ +export class ScreenshotDialog extends Overlay { + private nameInput: HTMLInputElement; + private takeScreenshotButton: HTMLButtonElement; + private closeMenuButton: HTMLButtonElement; + private cancelScreenshotButton: HTMLButtonElement; + private forceScreenshotButton: HTMLButtonElement; + private statisticsTable: HTMLTableElement; + private panelResolutionTable: HTMLTableElement; + private layerResolutionTable: HTMLTableElement; + private statisticsContainer: HTMLDivElement; + private filenameInputContainer: HTMLDivElement; + private screenshotSizeText: HTMLDivElement; + private warningElement: HTMLDivElement; + private footerScreenshotActionBtnsContainer: HTMLDivElement; + private progressText: HTMLParagraphElement; + private scaleRadioButtonsContainer: HTMLDivElement; + private keepSliceFOVFixedCheckbox: HTMLInputElement; + private helpTooltips: { + generalSettingsTooltip: HTMLElement; + orthographicSettingsTooltip: HTMLElement; + layerDataTooltip: HTMLElement; + scaleFactorHelpTooltip: HTMLElement; + }; + private statisticsKeyToCellMap: Map = new Map(); + private layerResolutionKeyToCellMap: Map = + new Map(); + + private throttledUpdateTableStatistics = this.registerCancellable( + throttle(() => { + this.populateLayerResolutionTable(); + this.handleScreenshotResize(); + this.populatePanelResolutionTable(); + }, 500), + ); + private screenshotWidth: number = 0; + private screenshotHeight: number = 0; + private screenshotPixelSize: HTMLElement; + constructor(private screenshotManager: ScreenshotManager) { + super(); + + this.initializeUI(); + this.setupEventListeners(); + this.screenshotManager.throttledSendStatistics(); + } + + dispose(): void { + super.dispose(); + if (!DEBUG_ALLOW_MENU_CLOSE) { + this.screenshotManager.shouldKeepSliceViewFOVFixed = true; + this.screenshotManager.screenshotScale = 1; + this.screenshotManager.cancelScreenshot(); + } + } + + close(): void { + if ( + this.screenshotMode !== ScreenshotMode.PREVIEW && + !DEBUG_ALLOW_MENU_CLOSE + ) { + StatusMessage.showTemporaryMessage( + "Cannot close screenshot menu while a screenshot is in progress. Hit 'Cancel screenshot' to stop the screenshot, or 'Force screenshot' to screenshot the currently available data.", + 4000, + ); + } else { + super.close(); + } + } + + private setupHelpTooltips() { + const generalSettingsTooltip = makeIcon({ + svg: svg_help, + title: splitIntoLines(TOOLTIPS.generalSettingsTooltip), + }); + + const orthographicSettingsTooltip = makeIcon({ + svg: svg_help, + title: TOOLTIPS.orthographicSettingsTooltip, + }); + orthographicSettingsTooltip.classList.add( + "neuroglancer-screenshot-resolution-table-tooltip", + ); + + const layerDataTooltip = makeIcon({ + svg: svg_help, + title: splitIntoLines(TOOLTIPS.layerDataTooltip), + }); + layerDataTooltip.classList.add( + "neuroglancer-screenshot-resolution-table-tooltip", + ); + + const scaleFactorHelpTooltip = makeIcon({ + svg: svg_help, + title: splitIntoLines(TOOLTIPS.scaleFactorHelpTooltip), + }); + + return (this.helpTooltips = { + generalSettingsTooltip, + orthographicSettingsTooltip, + layerDataTooltip, + scaleFactorHelpTooltip, + }); + } + + private initializeUI() { + const tooltips = this.setupHelpTooltips(); + this.content.classList.add("neuroglancer-screenshot-dialog"); + const parentElement = this.content.parentElement; + if (parentElement) { + parentElement.classList.add("neuroglancer-screenshot-overlay"); + } + + const titleText = document.createElement("h2"); + titleText.classList.add("neuroglancer-screenshot-title"); + titleText.textContent = "Screenshot"; + + this.closeMenuButton = this.createButton( + null, + () => this.close(), + "neuroglancer-screenshot-close-button", + svg_close, + ); + + this.cancelScreenshotButton = this.createButton( + "Cancel screenshot", + () => this.cancelScreenshot(), + "neuroglancer-screenshot-footer-button", + ); + this.takeScreenshotButton = this.createButton( + "Take screenshot", + () => this.screenshot(), + "neuroglancer-screenshot-footer-button", + ); + this.forceScreenshotButton = this.createButton( + "Force screenshot", + () => this.forceScreenshot(), + "neuroglancer-screenshot-footer-button", + ); + this.filenameInputContainer = document.createElement("div"); + this.filenameInputContainer.classList.add( + "neuroglancer-screenshot-filename-container", + ); + const menuText = document.createElement("h3"); + menuText.classList.add("neuroglancer-screenshot-title-subheading"); + menuText.classList.add("neuroglancer-screenshot-title"); + menuText.textContent = "Settings"; + menuText.appendChild(tooltips.generalSettingsTooltip); + this.filenameInputContainer.appendChild(menuText); + + const nameInputLabel = document.createElement("label"); + nameInputLabel.textContent = "Screenshot name"; + nameInputLabel.classList.add("neuroglancer-screenshot-label"); + nameInputLabel.classList.add("neuroglancer-screenshot-name-label"); + this.filenameInputContainer.appendChild(nameInputLabel); + this.filenameInputContainer.appendChild(this.createNameInput()); + + const closeAndHelpContainer = document.createElement("div"); + closeAndHelpContainer.classList.add("neuroglancer-screenshot-close"); + + closeAndHelpContainer.appendChild(titleText); + closeAndHelpContainer.appendChild(this.closeMenuButton); + + // This is the header + this.content.appendChild(closeAndHelpContainer); + + const mainBody = document.createElement("div"); + mainBody.classList.add("neuroglancer-screenshot-main-body-container"); + this.content.appendChild(mainBody); + + mainBody.appendChild(this.filenameInputContainer); + mainBody.appendChild(this.createScaleRadioButtons()); + + const previewContainer = document.createElement("div"); + previewContainer.classList.add( + "neuroglancer-screenshot-resolution-preview-container", + ); + const settingsPreview = document.createElement("div"); + settingsPreview.classList.add( + "neuroglancer-screenshot-resolution-table-container", + ); + const previewTopContainer = document.createElement("div"); + previewTopContainer.classList.add( + "neuroglancer-screenshot-resolution-preview-top-container", + ); + previewTopContainer.style.display = "flex"; + const previewLabel = document.createElement("h2"); + previewLabel.classList.add("neuroglancer-screenshot-title"); + previewLabel.textContent = "Preview"; + + this.screenshotSizeText = document.createElement("div"); + this.screenshotSizeText.classList.add("neuroglancer-screenshot-label"); + this.screenshotSizeText.classList.add("neuroglancer-screenshot-size-text"); + const screenshotLabel = document.createElement("h3"); + screenshotLabel.textContent = "Screenshot size"; + screenshotLabel.classList.add( + "neuroglancer-screenshot-resolution-size-label", + ); + this.screenshotPixelSize = document.createElement("span"); + this.screenshotPixelSize.classList.add( + "neuroglancer-screenshot-resolution-size-value", + ); + + const screenshotCopyButton = makeCopyButton({ + title: "Copy table to clipboard", + onClick: () => { + const result = setClipboard(this.getResolutionText()); + StatusMessage.showTemporaryMessage( + result + ? "Resolution table copied to clipboard" + : "Failed to copy resolution table to clipboard", + ); + }, + }); + screenshotCopyButton.classList.add("neuroglancer-screenshot-copy-icon"); + + this.screenshotSizeText.appendChild(screenshotLabel); + this.screenshotSizeText.appendChild(this.screenshotPixelSize); + + previewContainer.appendChild(previewTopContainer); + previewTopContainer.appendChild(previewLabel); + previewTopContainer.appendChild(screenshotCopyButton); + previewContainer.appendChild(this.screenshotSizeText); + previewContainer.appendChild(settingsPreview); + settingsPreview.appendChild(this.createPanelResolutionTable()); + settingsPreview.appendChild(this.createLayerResolutionTable()); + + mainBody.appendChild(previewContainer); + mainBody.appendChild(this.createStatisticsTable()); + + this.footerScreenshotActionBtnsContainer = document.createElement("div"); + this.footerScreenshotActionBtnsContainer.classList.add( + "neuroglancer-screenshot-footer-container", + ); + this.progressText = document.createElement("p"); + this.progressText.classList.add("neuroglancer-screenshot-progress-text"); + this.footerScreenshotActionBtnsContainer.appendChild(this.progressText); + this.footerScreenshotActionBtnsContainer.appendChild( + this.cancelScreenshotButton, + ); + this.footerScreenshotActionBtnsContainer.appendChild( + this.takeScreenshotButton, + ); + this.footerScreenshotActionBtnsContainer.appendChild( + this.forceScreenshotButton, + ); + this.content.appendChild(this.footerScreenshotActionBtnsContainer); + + this.screenshotManager.previewScreenshot(); + this.updateUIBasedOnMode(); + this.populatePanelResolutionTable(); + this.throttledUpdateTableStatistics(); + } + + private setupEventListeners() { + this.registerDisposer( + this.screenshotManager.screenshotFinished.add(() => { + this.dispose(); + }), + ); + this.registerDisposer( + this.screenshotManager.statisticsUpdated.add((screenshotLoadStats) => { + this.populateStatistics(screenshotLoadStats); + }), + ); + this.registerDisposer( + this.screenshotManager.viewer.display.updateFinished.add(() => { + this.throttledUpdateTableStatistics(); + }), + ); + this.registerDisposer( + this.screenshotManager.zoomMaybeChanged.add(() => { + this.populatePanelResolutionTable(); + }), + ); + } + + private createNameInput(): HTMLInputElement { + const nameInput = document.createElement("input"); + nameInput.type = "text"; + nameInput.placeholder = "Enter optional screenshot name"; + nameInput.classList.add("neuroglancer-screenshot-name-input"); + return (this.nameInput = nameInput); + } + + private createButton( + text: string | null, + onClick: () => void, + cssClass: string = "", + svgUrl: string | null = null, + ): HTMLButtonElement { + const button = document.createElement("button"); + if (svgUrl) { + const icon = makeIcon({ svg: svgUrl }); + button.appendChild(icon); + } else if (text) { + button.textContent = text; + } + button.classList.add("neuroglancer-screenshot-button"); + if (cssClass) button.classList.add(cssClass); + button.addEventListener("click", onClick); + return button; + } + + private createScaleRadioButtons() { + const scaleMenu = document.createElement("div"); + scaleMenu.classList.add("neuroglancer-screenshot-scale-menu"); + + const scaleLabel = document.createElement("label"); + scaleLabel.classList.add("neuroglancer-screenshot-scale-factor-label"); + scaleLabel.classList.add("neuroglancer-screenshot-label"); + scaleLabel.textContent = "Screenshot scale factor"; + + scaleLabel.appendChild(this.helpTooltips.scaleFactorHelpTooltip); + + scaleMenu.appendChild(scaleLabel); + + this.scaleRadioButtonsContainer = document.createElement("div"); + this.scaleRadioButtonsContainer.classList.add( + "neuroglancer-screenshot-scale-radio-container", + ); + scaleMenu.appendChild(this.scaleRadioButtonsContainer); + + this.warningElement = document.createElement("div"); + this.warningElement.classList.add("neuroglancer-screenshot-warning"); + this.warningElement.textContent = ""; + + const scales = [1, 2, 4]; + scales.forEach((scale) => { + const container = document.createElement("div"); + const label = document.createElement("label"); + const input = document.createElement("input"); + + input.type = "radio"; + input.name = "screenshot-scale"; + input.value = scale.toString(); + input.checked = scale === this.screenshotManager.screenshotScale; + input.classList.add("neuroglancer-screenshot-scale-radio-input"); + + label.appendChild(document.createTextNode(`${scale}x`)); + label.classList.add("neuroglancer-screenshot-scale-radio-label"); + + container.classList.add("neuroglancer-screenshot-scale-radio-item"); + container.appendChild(input); + container.appendChild(label); + this.scaleRadioButtonsContainer.appendChild(container); + + input.addEventListener("change", () => { + this.screenshotManager.screenshotScale = scale; + this.handleScreenshotResize(); + }); + }); + scaleMenu.appendChild(this.warningElement); + + const keepSliceFOVFixedDiv = document.createElement("div"); + keepSliceFOVFixedDiv.classList.add( + "neuroglancer-screenshot-keep-slice-label", + ); + keepSliceFOVFixedDiv.classList.add("neuroglancer-screenshot-label"); + keepSliceFOVFixedDiv.textContent = "Keep slice FOV fixed with scale change"; + + const keepSliceFOVFixedCheckbox = document.createElement("input"); + keepSliceFOVFixedCheckbox.classList.add( + "neuroglancer-screenshot-keep-slice-fov-checkbox", + ); + keepSliceFOVFixedCheckbox.type = "checkbox"; + keepSliceFOVFixedCheckbox.checked = + this.screenshotManager.shouldKeepSliceViewFOVFixed; + keepSliceFOVFixedCheckbox.addEventListener("change", () => { + this.screenshotManager.shouldKeepSliceViewFOVFixed = + keepSliceFOVFixedCheckbox.checked; + }); + this.keepSliceFOVFixedCheckbox = keepSliceFOVFixedCheckbox; + keepSliceFOVFixedDiv.appendChild(keepSliceFOVFixedCheckbox); + scaleMenu.appendChild(keepSliceFOVFixedDiv); + + this.handleScreenshotResize(); + return scaleMenu; + } + + private createStatisticsTable() { + this.statisticsContainer = document.createElement("div"); + this.statisticsContainer.classList.add( + "neuroglancer-screenshot-statistics-title", + ); + this.statisticsContainer.style.padding = "1rem"; + + this.statisticsTable = document.createElement("table"); + this.statisticsTable.classList.add( + "neuroglancer-screenshot-statistics-table", + ); + + const headerRow = this.statisticsTable.createTHead().insertRow(); + const keyHeader = document.createElement("th"); + keyHeader.textContent = "Screenshot progress"; + keyHeader.classList.add("neuroglancer-screenshot-title"); + headerRow.appendChild(keyHeader); + const valueHeader = document.createElement("th"); + valueHeader.textContent = ""; + headerRow.appendChild(valueHeader); + + const descriptionRow = this.statisticsTable.createTHead().insertRow(); + const descriptionkeyHeader = document.createElement("th"); + descriptionkeyHeader.classList.add( + "neuroglancer-statistics-table-description-header", + ); + descriptionkeyHeader.colSpan = 2; + + descriptionkeyHeader.textContent = + "The screenshot will take when all the chunks are loaded. If GPU memory is full, the screenshot will only capture the successfully loaded chunks. A screenshot scale larger than 1 may cause new chunks to be downloaded once the screenshot is in progress."; + + // It can be used to point to a docs page when complete + // const descriptionLearnMoreLink = document.createElement("a"); + // descriptionLearnMoreLink.text = "Learn more"; + // descriptionLearnMoreLink.classList.add("neuroglancer-statistics-table-description-link") + + // descriptionkeyHeader.appendChild(descriptionLearnMoreLink); + descriptionRow.appendChild(descriptionkeyHeader); + + // Populate inital table elements with placeholder text + const orderedStatsRow: UIScreenshotStatistics = { + chunkUsageDescription: "", + gpuMemoryUsageDescription: "", + downloadSpeedDescription: "", + }; + for (const key in orderedStatsRow) { + const row = this.statisticsTable.insertRow(); + const keyCell = row.insertCell(); + keyCell.classList.add( + "neuroglancer-screenshot-statistics-table-data-key", + ); + const valueCell = row.insertCell(); + valueCell.classList.add( + "neuroglancer-screenshot-statistics-table-data-value", + ); + keyCell.textContent = + statisticsNamesForUI[key as keyof typeof statisticsNamesForUI]; + valueCell.textContent = + orderedStatsRow[key as keyof typeof orderedStatsRow]; + this.statisticsKeyToCellMap.set(key, valueCell); + } + + this.populateStatistics(this.screenshotManager.screenshotLoadStats); + this.statisticsContainer.appendChild(this.statisticsTable); + return this.statisticsContainer; + } + + private createPanelResolutionTable() { + const resolutionTable = (this.panelResolutionTable = + document.createElement("table")); + resolutionTable.classList.add("neuroglancer-screenshot-resolution-table"); + + const headerRow = resolutionTable.createTHead().insertRow(); + const keyHeader = document.createElement("th"); + keyHeader.textContent = PANEL_TABLE_HEADER_STRINGS.type; + keyHeader.appendChild(this.helpTooltips.orthographicSettingsTooltip); + + headerRow.appendChild(keyHeader); + const pixelValueHeader = document.createElement("th"); + pixelValueHeader.textContent = PANEL_TABLE_HEADER_STRINGS.pixelResolution; + headerRow.appendChild(pixelValueHeader); + const physicalValueHeader = document.createElement("th"); + physicalValueHeader.textContent = + PANEL_TABLE_HEADER_STRINGS.physicalResolution; + headerRow.appendChild(physicalValueHeader); + return resolutionTable; + } + + private populatePanelResolutionTable() { + // Clear the table before populating it + while (this.panelResolutionTable.rows.length > 1) { + this.panelResolutionTable.deleteRow(1); + } + const resolutionTable = this.panelResolutionTable; + const resolutions = getViewerPanelResolutions( + this.screenshotManager.viewer.display.panels, + ); + for (const resolution of resolutions) { + const physicalResolution = formatPhysicalResolution( + resolution.physicalResolution, + ); + const pixelResolution = formatPixelResolution(resolution.pixelResolution); + const row = resolutionTable.insertRow(); + const keyCell = row.insertCell(); + const pixelValueCell = row.insertCell(); + pixelValueCell.textContent = `${pixelResolution.width} x ${pixelResolution.height} px`; + const physicalValueCell = row.insertCell(); + keyCell.textContent = physicalResolution.type; + physicalValueCell.innerHTML = physicalResolution.resolution; + } + return resolutionTable; + } + + private createLayerResolutionTable() { + const resolutionTable = (this.layerResolutionTable = + document.createElement("table")); + resolutionTable.classList.add("neuroglancer-screenshot-resolution-table"); + + const headerRow = resolutionTable.createTHead().insertRow(); + const keyHeader = document.createElement("th"); + keyHeader.textContent = LAYER_TABLE_HEADER_STRINGS.name; + keyHeader.appendChild(this.helpTooltips.layerDataTooltip); + + headerRow.appendChild(keyHeader); + const typeHeader = document.createElement("th"); + typeHeader.textContent = LAYER_TABLE_HEADER_STRINGS.type; + headerRow.appendChild(typeHeader); + const valueHeader = document.createElement("th"); + valueHeader.textContent = LAYER_TABLE_HEADER_STRINGS.resolution; + headerRow.appendChild(valueHeader); + return resolutionTable; + } + + private populateLayerResolutionTable() { + const resolutionTable = this.layerResolutionTable; + const resolutionMap = getViewerLayerResolutions( + this.screenshotManager.viewer, + ); + for (const [key, value] of resolutionMap) { + const { name, type } = key; + if (type === "MultiscaleMeshLayer") { + continue; + } + const stringKey = `{${name}--${type}}`; + let valueCell = this.layerResolutionKeyToCellMap.get(stringKey); + if (valueCell === undefined) { + const row = resolutionTable.insertRow(); + const keyCell = row.insertCell(); + const typeCell = row.insertCell(); + valueCell = row.insertCell(); + keyCell.textContent = name; + typeCell.textContent = + layerNamesForUI[type as keyof typeof layerNamesForUI]; + this.layerResolutionKeyToCellMap.set(stringKey, valueCell); + } + valueCell.innerHTML = formatPhysicalResolution(value).resolution; + } + } + + private forceScreenshot() { + this.screenshotManager.forceScreenshot(); + } + + private cancelScreenshot() { + this.screenshotManager.cancelScreenshot(true /* shouldStayInPrevieMenu */); + this.updateUIBasedOnMode(); + } + + private screenshot() { + const filename = this.nameInput.value; + this.screenshotManager.takeScreenshot(filename); + this.updateUIBasedOnMode(); + } + + private populateStatistics( + screenshotLoadStats: ScreenshotLoadStatistics | null, + ) { + const statsRow = this.parseStatistics(screenshotLoadStats); + if (statsRow === null) { + return; + } + + for (const key in statsRow) { + this.statisticsKeyToCellMap.get(key)!.textContent = String( + statsRow[key as keyof typeof statsRow], + ); + } + } + + private handleScreenshotResize() { + const screenshotSize = + this.screenshotManager.calculatedClippedViewportSize(); + const scale = this.screenshotManager.screenshotScale.toFixed(2); + const numPixels = Math.round(Math.sqrt(MAX_RENDER_AREA_PIXELS)); + // Add a little to account for potential rounding errors + if ( + (screenshotSize.width + 2) * (screenshotSize.height + 2) >= + MAX_RENDER_AREA_PIXELS + ) { + this.warningElement.textContent = `Screenshots can't have more than ${numPixels}x${numPixels} total pixels, the scale factor was reduced to x${scale} to fit.`; + } else { + this.warningElement.textContent = ""; + } + this.screenshotWidth = screenshotSize.width; + this.screenshotHeight = screenshotSize.height; + // Update the screenshot size display whenever dimensions change + this.updateScreenshotSizeDisplay(); + } + + private updateScreenshotSizeDisplay() { + if (this.screenshotPixelSize) { + this.screenshotPixelSize.textContent = `${this.screenshotWidth} x ${this.screenshotHeight} px`; + } + } + + private parseStatistics( + currentStatistics: ScreenshotLoadStatistics | null, + ): UIScreenshotStatistics | null { + if (currentStatistics === null) { + return null; + } + + const percentLoaded = + currentStatistics.visibleChunksTotal === 0 + ? 0 + : (100 * currentStatistics.visibleChunksGpuMemory) / + currentStatistics.visibleChunksTotal; + const percentGpuUsage = + (100 * currentStatistics.visibleGpuMemory) / + currentStatistics.gpuMemoryCapacity; + const gpuMemoryUsageInMB = currentStatistics.visibleGpuMemory / 1000000; + const totalMemoryInMB = currentStatistics.gpuMemoryCapacity / 1000000; + const latency = isNaN(currentStatistics.downloadLatency) + ? 0 + : currentStatistics.downloadLatency; + + const downloadString = + currentStatistics.visibleChunksDownloading == 0 + ? "0" + : `${currentStatistics.visibleChunksDownloading} at ${latency.toFixed(0)}ms latency`; + + return { + chunkUsageDescription: `${currentStatistics.visibleChunksGpuMemory} out of ${currentStatistics.visibleChunksTotal} (${percentLoaded.toFixed(2)}%)`, + gpuMemoryUsageDescription: `${gpuMemoryUsageInMB.toFixed(0)}MB / ${totalMemoryInMB.toFixed(0)}MB (${percentGpuUsage.toFixed(2)}% of total)`, + downloadSpeedDescription: downloadString, + }; + } + + /** + Private function to copy the resolution of the screenshot to the clipboard + This will be in tsv format, with the width and height separated by an 'x' + */ + private getResolutionText() { + // Processing the Screenshot size + const screenshotSizeText = `Screenshot size\t${this.screenshotWidth} x ${this.screenshotHeight} px\n`; + + // Process the panel resolution table + const { panelResolutionData, layerResolutionData } = + getViewerResolutionMetadata(this.screenshotManager.viewer); + + let panelResolutionText = `${PANEL_TABLE_HEADER_STRINGS.type}\t${PANEL_TABLE_HEADER_STRINGS.pixelResolution}\t${PANEL_TABLE_HEADER_STRINGS.physicalResolution}\n`; + for (const resolution of panelResolutionData) { + panelResolutionText += `${resolution.type}\t${resolution.width} x ${resolution.height} px\t${resolution.resolution}\n`; + } + + // Process the layer resolution table + let layerResolutionText = `${LAYER_TABLE_HEADER_STRINGS.name}\t${LAYER_TABLE_HEADER_STRINGS.type}\t${LAYER_TABLE_HEADER_STRINGS.resolution}\n`; + for (const resolution of layerResolutionData) { + layerResolutionText += `${resolution.name}\t${layerNamesForUI[resolution.type as keyof typeof layerNamesForUI]}\t${resolution.resolution}\n`; + } + + return `${screenshotSizeText}\n${panelResolutionText}\n${layerResolutionText}`; + } + + private updateUIBasedOnMode() { + if (this.screenshotMode === ScreenshotMode.PREVIEW) { + this.nameInput.disabled = false; + for (const radio of this.scaleRadioButtonsContainer.children) { + for (const child of (radio as HTMLElement).children) { + if (child instanceof HTMLInputElement) child.disabled = false; + } + } + this.keepSliceFOVFixedCheckbox.disabled = false; + this.forceScreenshotButton.disabled = true; + this.cancelScreenshotButton.disabled = true; + this.takeScreenshotButton.disabled = false; + this.progressText.textContent = ""; + this.forceScreenshotButton.title = ""; + } else { + this.nameInput.disabled = true; + for (const radio of this.scaleRadioButtonsContainer.children) { + for (const child of (radio as HTMLElement).children) { + if (child instanceof HTMLInputElement) child.disabled = true; + } + } + this.keepSliceFOVFixedCheckbox.disabled = true; + this.forceScreenshotButton.disabled = false; + this.cancelScreenshotButton.disabled = false; + this.takeScreenshotButton.disabled = true; + this.progressText.textContent = "Screenshot in progress..."; + this.forceScreenshotButton.title = + "Force a screenshot of the current view without waiting for all data to be loaded and rendered"; + } + } + + get screenshotMode() { + return this.screenshotManager.screenshotMode; + } +} diff --git a/src/ui/segment_list.ts b/src/ui/segment_list.ts index ccadae84a4..6ae8db3592 100644 --- a/src/ui/segment_list.ts +++ b/src/ui/segment_list.ts @@ -107,7 +107,6 @@ abstract class SegmentListSource // explicit uint64 ids, and the `matches`, list, specifying the indices into the // `segmentPropertyMap` of the matching segments. explicitSegments: Uint64[] | undefined; - explicitSegmentsVisible = false; debouncedUpdate = debounce(() => this.update(), 0); @@ -136,8 +135,6 @@ abstract class SegmentListSource } class StarredSegmentsListSource extends SegmentListSource { - explicitSegmentsVisible: true; - constructor( public segmentationDisplayState: SegmentationDisplayState, public parentElement: HTMLElement, @@ -194,7 +191,6 @@ class SegmentQueryListSource extends SegmentListSource { matchStatusTextPrefix = ""; selectedSegmentsGeneration = -1; visibleSegmentsGeneration = -1; - explicitSegmentsVisible = false; get numMatches() { return this.queryResult.value?.count ?? 0; @@ -218,7 +214,7 @@ class SegmentQueryListSource extends SegmentListSource { let matchStatusTextPrefix = ""; const unconstrained = isQueryUnconstrained(queryResult.query); if (!unconstrained) { - if (this.explicitSegments !== undefined && this.explicitSegmentsVisible) { + if (this.explicitSegments !== undefined) { splices.push({ deleteCount: this.explicitSegments.length, retainCount: 0, @@ -232,7 +228,7 @@ class SegmentQueryListSource extends SegmentListSource { const { explicitIds } = queryResult; if (explicitIds !== undefined) { this.explicitSegments = explicitIds; - } else if (!this.explicitSegmentsVisible) { + } else { this.explicitSegments = undefined; } diff --git a/src/ui/segmentation_display_options_tab.ts b/src/ui/segmentation_display_options_tab.ts index a37b4339a7..b145d4a398 100644 --- a/src/ui/segmentation_display_options_tab.ts +++ b/src/ui/segmentation_display_options_tab.ts @@ -123,9 +123,12 @@ export class DisplayOptionsTab extends Tab { } class ShaderCodeOverlay extends Overlay { - codeWidget = this.registerDisposer(makeSkeletonShaderCodeWidget(this.layer)); + codeWidget: ShaderCodeWidget; constructor(public layer: SegmentationUserLayer) { super(); + this.codeWidget = this.registerDisposer( + makeSkeletonShaderCodeWidget(layer), + ); this.content.classList.add( "neuroglancer-segmentation-layer-skeleton-shader-overlay", ); diff --git a/src/ui/side_panel.ts b/src/ui/side_panel.ts index a0e9c285f7..14d97c437a 100644 --- a/src/ui/side_panel.ts +++ b/src/ui/side_panel.ts @@ -18,10 +18,15 @@ import "#src/ui/side_panel.css"; import type { DisplayContext } from "#src/display_context.js"; import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; -import type { Side } from "#src/ui/side_panel_location.js"; +import type { Side, SidePanelLocation } from "#src/ui/side_panel_location.js"; import { TrackableSidePanelLocation } from "#src/ui/side_panel_location.js"; import { RefCounted } from "#src/util/disposable.js"; import { updateChildren } from "#src/util/dom.js"; +import { + getDropEffect, + getDropEffectFromModifiers, + setDropEffect, +} from "#src/util/drag_and_drop.js"; import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Signal } from "#src/util/signal.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; @@ -87,6 +92,11 @@ export class SidePanel extends RefCounted { visibility = new WatchableVisibilityPriority( WatchableVisibilityPriority.VISIBLE, ); + + getDragDropDescription() { + return "side panel"; + } + constructor( public sidePanelManager: SidePanelManager, public location: TrackableSidePanelLocation = new TrackableSidePanelLocation(), @@ -101,26 +111,55 @@ export class SidePanel extends RefCounted { setTimeout(() => { element.style.backgroundColor = ""; }, 0); - pushDragStatus(element, "drag", () => { - return document.createTextNode( - "Drag side panel to move it to the left/right/top/bottom of another panel", - ); - }); + pushDragStatus( + event, + element, + "drag", + `Drag ${this.getDragDropDescription()} to move it to the left/right/top/bottom of another panel`, + ); }); element.addEventListener("dragend", (event: DragEvent) => { - event; this.sidePanelManager.endDrag(); - popDragStatus(element, "drag"); + popDragStatus(event, element, "drag"); }); } + canCopy() { + return false; + } + + copyToNewLocation(location: SidePanelLocation) { + location; + } + makeDragSource(): DragSource { return { - dropAsNewPanel: (location) => { + dropAsNewPanel: (location, dropEffect) => { const oldLocation = this.location.value; - this.location.value = { ...oldLocation, ...location }; + const newLocation: SidePanelLocation = { ...oldLocation, ...location }; + console.log({ oldLocation, newLocation }); + if (dropEffect === "copy") { + this.copyToNewLocation(newLocation); + return; + } + this.location.value = newLocation; this.location.locationChanged.dispatch(); }, + getNewPanelDropEffect: (event) => { + const description = this.getDragDropDescription(); + if (this.canCopy()) { + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ "move", + /*moveAllowed=*/ true, + ); + return { + description, + ...result, + }; + } + return { description, dropEffect: "move" }; + }, }; } @@ -193,7 +232,16 @@ export interface SidePanelDropLocation { export interface DragSource { canDropAsTabs?: (target: SidePanel) => number; dropAsTab?: (target: SidePanel) => void; - dropAsNewPanel: (location: SidePanelDropLocation) => void; + dropAsNewPanel: ( + location: SidePanelDropLocation, + dropEffect: DataTransfer["dropEffect"], + ) => void; + getNewPanelDropEffect: (event: DragEvent) => { + dropEffect: DataTransfer["dropEffect"]; + description: string; + dropEffectMessage?: string; + leaveHandler?: () => void; + }; } export interface RegisteredSidePanel { @@ -307,33 +355,46 @@ export class SidePanelManager extends RefCounted { element.style.position = "relative"; element.style[MARGIN_FOR_SIDE[OPPOSITE_SIDE[zoneSide]]] = `-${size}px`; } + + const update = (event: DragEvent) => { + const { dragSource } = this; + if (dragSource === undefined) return false; + event.preventDefault(); + const { dropEffect, description, dropEffectMessage, leaveHandler } = + dragSource.getNewPanelDropEffect(event); + setDropEffect(event, dropEffect); + let message = `Drop to ${dropEffect} ${description} to new ${zoneFlexDirection}`; + if (dropEffectMessage) message += ` (${dropEffectMessage})`; + pushDragStatus(event, element, "drop", message, leaveHandler); + return true; + }; element.addEventListener("dragenter", (event) => { - if (!this.hasDroppablePanel()) return; + if (!update(event)) return; element.classList.add(DRAG_OVER_CLASSNAME); event.preventDefault(); - pushDragStatus(element, "drop", () => - document.createTextNode(`Drop side panel as new ${zoneFlexDirection}`), - ); }); - element.addEventListener("dragleave", () => { - popDragStatus(element, "drop"); + element.addEventListener("dragleave", (event) => { + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); }); element.addEventListener("dragover", (event) => { - if (!this.hasDroppablePanel()) return; + if (!update(event)) return; event.preventDefault(); }); element.addEventListener("drop", (event) => { const { dragSource } = this; if (dragSource === undefined) return; - popDragStatus(element, "drop"); + popDragStatus(event, element, "drop"); element.classList.remove(DRAG_OVER_CLASSNAME); const flexDirection = FLEX_DIRECTION_FOR_SIDE[side]; - dragSource.dropAsNewPanel({ - side, - row: flexDirection === "column" ? flexIndex : crossIndex, - col: flexDirection === "row" ? flexIndex : crossIndex, - }); + dragSource.dropAsNewPanel( + { + side, + row: flexDirection === "column" ? flexIndex : crossIndex, + col: flexDirection === "row" ? flexIndex : crossIndex, + }, + getDropEffect() ?? "none", + ); this.dragSource = undefined; event.preventDefault(); event.stopPropagation(); @@ -421,6 +482,7 @@ export class SidePanelManager extends RefCounted { const minSize = flexGroup.minSize; const updateMessage = () => { pushDragStatus( + event, gutter, "drag", `Drag to resize, current ${SIZE_FOR_DIRECTION[direction]} is ${flexGroup.crossSize}px`, @@ -436,8 +498,8 @@ export class SidePanelManager extends RefCounted { updateMessage(); this.invalidateLayout(); }, - () => { - popDragStatus(gutter, "drag"); + (event) => { + popDragStatus(event, gutter, "drag"); }, ); }); @@ -479,8 +541,9 @@ export class SidePanelManager extends RefCounted { } if (nextFlexIndex === cells.length) return; const nextCell = cells[nextFlexIndex]; - const updateMessage = () => { + const updateMessage = (event: MouseEvent) => { pushDragStatus( + event, gutter, "drag", `Drag to resize, current ${SIZE_FOR_DIRECTION[direction]} ratio is ` + @@ -488,7 +551,7 @@ export class SidePanelManager extends RefCounted { `${nextCell.registeredPanel.location.value.flex}`, ); }; - updateMessage(); + updateMessage(event); startRelativeMouseDrag( event, (newEvent) => { @@ -519,13 +582,13 @@ export class SidePanelManager extends RefCounted { ...secondLocation, flex: Math.round((1 - firstFraction) * existingFlexSum * 100) / 100, }; - updateMessage(); + updateMessage(newEvent); cell.registeredPanel.location.locationChanged.dispatch(); nextCell.registeredPanel.location.locationChanged.dispatch(); this.invalidateLayout(); }, - () => { - popDragStatus(gutter, "drag"); + (event) => { + popDragStatus(event, gutter, "drag"); }, ); }); diff --git a/src/ui/tool.ts b/src/ui/tool.ts index c422e430ff..84669b289b 100644 --- a/src/ui/tool.ts +++ b/src/ui/tool.ts @@ -24,9 +24,19 @@ import { debounce } from "lodash-es"; import type { MouseSelectionState, UserLayer } from "#src/layer/index.js"; import { StatusMessage } from "#src/status.js"; import type { TrackableValueInterface } from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { beginToolDrag, endToolDrag } from "#src/ui/tool_drag_and_drop.js"; +import type { + MultiToolPaletteState, + ToolPalettePanel, +} from "#src/ui/tool_palette.js"; +import type { Query, QueryTerm } from "#src/ui/tool_query.js"; +import { matchesTerms, matchPredicate } from "#src/ui/tool_query.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import type { Borrowed, Owned } from "#src/util/disposable.js"; import { RefCounted } from "#src/util/disposable.js"; +import { getDropEffectFromModifiers } from "#src/util/drag_and_drop.js"; import type { ActionEvent, EventActionMap, @@ -73,7 +83,10 @@ export class ToolActivation extends RefCounted { export abstract class Tool extends RefCounted { changed = new Signal(); + unbound = new Signal(); + keyBinding: string | undefined = undefined; + savedJsonString: string | undefined = undefined; get context() { return this.localBinder.context; @@ -90,6 +103,11 @@ export abstract class Tool extends RefCounted { super(); } abstract activate(activation: ToolActivation): void; + renderInPalette(context: RefCounted): HTMLElement | undefined { + context; + return undefined; + } + abstract toJSON(): any; abstract description: string; unbind() { @@ -97,6 +115,7 @@ export abstract class Tool extends RefCounted { if (keyBinding !== undefined) { this.localBinder.set(keyBinding, undefined); } + this.unbound.dispatch(); } } @@ -157,9 +176,9 @@ export function restoreTool( while (true) { prototype = Object.getPrototypeOf(prototype); if (prototype === null) { - throw new Error(`Invalid tool type: ${JSON.stringify(obj)}.`); + return undefined; } - getter = toolsForPrototype.get(prototype)?.get(type); + getter = toolsForPrototype.get(prototype)?.get(type)?.getter; if (getter !== undefined) break; } return getter(context, obj); @@ -186,13 +205,21 @@ export type ToolGetter = ( options: any, ) => Owned | undefined; +export type ToolLister = ( + context: Context, + onChange?: () => void, +) => any[]; + export type LegacyToolGetter = ( layer: LayerType, options: any, ) => Owned | undefined; const legacyTools = new Map(); -const toolsForPrototype = new Map>(); +const toolsForPrototype = new Map< + object, + Map +>(); export function registerLegacyTool(type: string, getter: LegacyToolGetter) { legacyTools.set(type, getter); @@ -202,6 +229,7 @@ export function registerTool( contextType: AnyConstructor, type: string, getter: ToolGetter, + lister?: ToolLister, ) { const { prototype } = contextType; let tools = toolsForPrototype.get(prototype); @@ -209,7 +237,7 @@ export function registerTool( tools = new Map(); toolsForPrototype.set(prototype, tools); } - tools.set(type, getter); + tools.set(type, { getter, lister }); } export class SelectedLegacyTool @@ -277,7 +305,13 @@ export class GlobalToolBinder extends RefCounted { }, 100), ); - constructor(private inputEventMapBinder: InputEventMapBinder) { + localBinders = new Set(); + localBindersChanged = new Signal(); + + constructor( + private inputEventMapBinder: InputEventMapBinder, + public toolPaletteState: MultiToolPaletteState, + ) { super(); } @@ -285,35 +319,78 @@ export class GlobalToolBinder extends RefCounted { return this.bindings.get(key); } + private deleteBinding(tool: Tool) { + const keyBinding = tool.keyBinding!; + tool.keyBinding = undefined; + this.bindings.delete(keyBinding); + const localToolBinder = tool.localBinder; + localToolBinder.bindings.delete(keyBinding); + const { jsonToKey } = localToolBinder; + const { savedJsonString } = tool; + if (jsonToKey.get(savedJsonString!) === keyBinding) { + jsonToKey.delete(savedJsonString!); + } + this.destroyTool(tool); + } + + private toolJsonMaybeChanged(tool: Tool) { + // Check if tool is still bound. + let { keyBinding } = tool; + if (keyBinding === undefined) return; + let newJson = JSON.stringify(tool.toJSON()); + if (newJson === tool.savedJsonString) return; + + const localToolBinder = tool.localBinder; + localToolBinder.jsonToKey.delete(tool.savedJsonString!); + + // In the case of `DimensionTool`, there may be a chain of bindings that + // have to be updated. + while (true) { + const nextKeyBinding = localToolBinder.jsonToKey.get(newJson); + localToolBinder.jsonToKey.set(newJson, keyBinding!); + tool.savedJsonString = newJson; + keyBinding = nextKeyBinding; + if (keyBinding === undefined) { + // End of chain, all conflicts resolved. + break; + } + tool = localToolBinder.bindings.get(keyBinding)!; + const nextJson = JSON.stringify(tool.toJSON()); + if (nextJson === newJson) { + // End of chain, conflict remains. + this.deleteBinding(tool); + break; + } + newJson = nextJson; + } + localToolBinder.changed.dispatch(); + this.changed.dispatch(); + } + set(key: string, tool: Owned | undefined) { const { bindings } = this; const existingTool = bindings.get(key); if (existingTool !== undefined) { - existingTool.keyBinding = undefined; - bindings.delete(key); - const localToolBinder = existingTool.localBinder; - localToolBinder.bindings.delete(key); - localToolBinder.jsonToKey.delete(JSON.stringify(existingTool.toJSON())); - this.destroyTool(existingTool); - localToolBinder.changed.dispatch(); + this.deleteBinding(existingTool); + existingTool.localBinder.changed.dispatch(); } if (tool !== undefined) { const localToolBinder = tool.localBinder; const json = JSON.stringify(tool.toJSON()); + tool.savedJsonString = json; const existingKey = localToolBinder.jsonToKey.get(json); if (existingKey !== undefined) { const existingTool = localToolBinder.bindings.get(existingKey)!; - existingTool.keyBinding = undefined; - bindings.delete(existingKey); - localToolBinder.bindings.delete(existingKey); - localToolBinder.jsonToKey.delete(json); - this.destroyTool(existingTool); + this.deleteBinding(existingTool); } localToolBinder.bindings.set(key, tool); tool.keyBinding = key; localToolBinder.jsonToKey.set(json, key); bindings.set(key, tool); localToolBinder.changed.dispatch(); + tool.changed.add(() => { + this.toolJsonMaybeChanged(tool); + }); } this.changed.dispatch(); } @@ -395,6 +472,9 @@ export class GlobalToolBinder extends RefCounted { disposed() { this.deactivate_(); super.disposed(); + for (const tool of this.bindings.values()) { + tool.dispose(); + } } deactivate_() { @@ -405,6 +485,10 @@ export class GlobalToolBinder extends RefCounted { this.activeTool_ = undefined; activation.dispose(); } + + public deactivate() { + this.debounceDeactivate(); + } } export class LocalToolBinder< @@ -421,9 +505,17 @@ export class LocalToolBinder< public globalBinder: GlobalToolBinder, ) { super(); + globalBinder.localBinders.add(this); + globalBinder.localBindersChanged.dispatch(); + } + + getSortOrder() { + return Number.NEGATIVE_INFINITY; } disposed() { + this.globalBinder.localBinders.delete(this); + this.globalBinder.localBindersChanged.dispatch(); this.clear(); super.disposed(); } @@ -458,6 +550,14 @@ export class LocalToolBinder< return obj; } + getCommonToolProperties(): any { + return {}; + } + + convertLocalJSONToPaletteJSON(toolJson: any) { + return toolJson; + } + clear() { const { globalBinder, bindings } = this; if (bindings.size !== 0) { @@ -491,14 +591,58 @@ export class LocalToolBinder< } } +export class LayerToolBinder< + LayerType extends UserLayer, +> extends LocalToolBinder { + getCommonToolProperties() { + return { + layer: this.context.managedLayer.name, + layerType: this.context.managedLayer.layer?.type, + }; + } + convertLocalJSONToPaletteJSON(toolJson: any) { + let j = toolJson; + if (typeof j === "string") { + j = { type: j }; + } + return { layer: this.context.managedLayer.name, ...j }; + } + + getSortOrder(): number { + const { managedLayer } = this.context; + managedLayer.manager.layerManager.updateNonArchivedLayerIndices(); + return this.context.managedLayer.nonArchivedLayerIndex; + } +} + +export function updateToolDragDropEffect( + dragSource: ToolDragSource, + dropEffect?: string, + dropSamePalette: boolean = false, +) { + const { paletteState, dragElement } = dragSource; + if (paletteState === undefined || dragElement === undefined) return; + const cssClass = "neuroglancer-tool-to-be-removed"; + if (dropEffect === "move" && dropSamePalette === false) { + dragElement.classList.add(cssClass); + } else { + dragElement.classList.remove(cssClass); + } +} + export class ToolBindingWidget extends RefCounted { element = document.createElement("div"); - private toolJsonString = JSON.stringify(this.toolJson); + private toolJsonString: string; constructor( public localBinder: LocalToolBinder, public toolJson: any, + public dragElement: HTMLElement | undefined, + public paletteState: + | { tool: Tool; palette: ToolPalettePanel } + | undefined = undefined, ) { super(); + this.toolJsonString = JSON.stringify(toolJson); const { element } = this; element.classList.add("neuroglancer-tool-key-binding"); this.registerDisposer( @@ -516,6 +660,63 @@ export class ToolBindingWidget extends RefCounted { addToolKeyBindHandlers(this, element, (key) => this.localBinder.setJson(key, this.toolJson), ); + if (dragElement !== undefined) { + dragElement.draggable = true; + dragElement.addEventListener("dragstart", (event: DragEvent) => { + pushDragStatus( + event, + dragElement, + "drag", + "Drag tool to another tool palette, " + + "or to the left/top/right/bottom edge of a layer group to create a new tool palette", + ); + beginToolDrag(this); + const { toolPaletteState } = this.localBinder.globalBinder; + const self = this; + toolPaletteState.viewer.sidePanelManager.startDrag( + { + dropAsNewPanel: (location, dropEffect) => { + const palette = toolPaletteState.addNew({ location }); + palette.tools.insert( + this.localBinder.convertLocalJSONToPaletteJSON(toolJson), + ); + if (dropEffect === "move") { + const { paletteState } = this; + if (paletteState?.palette.state.queryDefined.value === false) { + paletteState.palette.state.tools.remove(paletteState.tool); + } + } + }, + getNewPanelDropEffect: (event) => { + const inExplicitPalette = + this.paletteState?.palette.state.queryDefined.value === false; + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ inExplicitPalette ? "move" : "copy", + /*moveAllowed=*/ inExplicitPalette, + ); + updateToolDragDropEffect( + self, + result.dropEffect, + /*dropSamePalette=*/ false, + ); + const leaveHandler = () => { + updateToolDragDropEffect(self); + }; + return { ...result, description: "tool", leaveHandler }; + }, + }, + event, + ); + }); + dragElement.addEventListener("dragend", (event: DragEvent) => { + popDragStatus(event, dragElement, "drag"); + endToolDrag(this); + const { toolPaletteState } = this.localBinder.globalBinder; + toolPaletteState.viewer.sidePanelManager.endDrag(); + event.stopPropagation(); + }); + } } private updateView() { @@ -575,13 +776,22 @@ export function addToolKeyBindHandlers( export function makeToolButton( context: RefCounted, localBinder: LocalToolBinder, - options: { toolJson: any; label?: string; title?: string }, + options: { + toolJson: any; + label?: string; + title?: string; + dragElement?: HTMLElement; + }, ) { const element = document.createElement("div"); element.classList.add("neuroglancer-tool-button"); element.appendChild( context.registerDisposer( - new ToolBindingWidget(localBinder, options.toolJson), + new ToolBindingWidget( + localBinder, + options.toolJson, + options.dragElement ?? element, + ), ).element, ); const labelElement = document.createElement("div"); @@ -632,3 +842,112 @@ export function makeToolActivationStatusMessageWithHeader( content.appendChild(body); return { message, body, header }; } + +function* getToolsFromListerMatchingTerms( + localBinder: LocalToolBinder, + lister: ToolLister, + terms: QueryTerm[], + commonProperties: { [key: string]: string }, + onChange: (() => void) | undefined, +) { + for (const tool of lister(localBinder.context, onChange)) { + if (matchesTerms(tool, terms)) { + yield { + ...localBinder.convertLocalJSONToPaletteJSON(tool), + ...commonProperties, + }; + } + } +} + +function* getToolsMatchingTerms( + localBinder: LocalToolBinder, + terms: QueryTerm[], + onChange?: () => void, +) { + const typePredicate = terms.find( + (term) => term.property === "type", + )?.predicate; + const typeEquals = + typePredicate !== undefined && "equals" in typePredicate + ? typePredicate.equals + : undefined; + const commonProperties = localBinder.getCommonToolProperties(); + for (const term of terms) { + const { property } = term; + if (property in commonProperties) { + if (!matchPredicate(term.predicate, commonProperties[property])) { + return; + } + } + } + const remainingTerms = terms.filter( + (term) => !(term.property in commonProperties) && term.property !== "type", + ); + + const { context } = localBinder; + let prototype = context; + while (true) { + prototype = Object.getPrototypeOf(prototype); + if (prototype === null) { + break; + } + const toolMap = toolsForPrototype.get(prototype); + if (toolMap === undefined) continue; + if (typeEquals !== undefined) { + const lister = toolMap.get(typeEquals)?.lister; + if (lister === undefined) continue; + yield* getToolsFromListerMatchingTerms( + localBinder, + lister, + remainingTerms, + commonProperties, + onChange, + ); + break; + } + for (const [type, { lister }] of toolMap) { + if (lister === undefined) continue; + if (typePredicate !== undefined && !matchPredicate(typePredicate, type)) { + continue; + } + yield* getToolsFromListerMatchingTerms( + localBinder, + lister, + remainingTerms, + commonProperties, + onChange, + ); + } + } +} + +export function getMatchingTools( + globalBinder: GlobalToolBinder, + query: Query, + onChange?: () => void, +): Map { + const matchingTools = new Map(); + + const localBinders = Array.from(globalBinder.localBinders); + localBinders.sort((a, b) => a.getSortOrder() - b.getSortOrder()); + + for (const localBinder of localBinders) { + for (const { include, terms } of query.clauses) { + for (const toolJson of getToolsMatchingTerms( + localBinder, + terms, + onChange, + )) { + const identifier = JSON.stringify(toolJson); + if (include) { + matchingTools.set(identifier, toolJson); + } else { + matchingTools.delete(identifier); + } + } + } + } + + return matchingTools; +} diff --git a/src/ui/tool_drag_and_drop.ts b/src/ui/tool_drag_and_drop.ts new file mode 100644 index 0000000000..baab0c27b1 --- /dev/null +++ b/src/ui/tool_drag_and_drop.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { LocalToolBinder, Tool } from "#src/ui/tool.js"; +import type { ToolPalettePanel } from "#src/ui/tool_palette.js"; + +export interface ToolDragSource { + readonly localBinder: LocalToolBinder; + readonly toolJson: any; + dragElement?: HTMLElement | undefined; + paletteState?: + | { + tool: Tool; + palette: ToolPalettePanel; + } + | undefined; +} + +export let toolDragSource: ToolDragSource | undefined = undefined; + +export function beginToolDrag(source: ToolDragSource) { + toolDragSource = source; +} + +export function endToolDrag(source: ToolDragSource) { + if (toolDragSource === source) { + toolDragSource = undefined; + } +} diff --git a/src/ui/tool_palette.css b/src/ui/tool_palette.css new file mode 100644 index 0000000000..5207d50f2f --- /dev/null +++ b/src/ui/tool_palette.css @@ -0,0 +1,205 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.neuroglancer-tool-palette-button-container { + display: inline-flex; + flex-direction: row; +} + +.neuroglancer-tool-palette-button-container { + border-radius: 20%; + border: 1px solid transparent; +} + +.neuroglancer-tool-palette-button-container:hover { + background-color: #484848; +} + +.neuroglancer-tool-palette-button { + position: relative; + display: flex; + flex-direction: row; +} + +.neuroglancer-tool-palette-dropdown { + position: absolute; + z-index: 100; + min-width: min(50vw, 300px); + border: 1px solid #aaa; + background-color: black; + padding: 2px; +} + +.neuroglancer-tool-palette-name { + flex: 1; + background-color: transparent; + border: 0px; + color: white; + outline: 0px; + /* ensure if name gets too long it doesn't push buttons over */ + width: 0px; + min-width: 0px; +} + +.neuroglancer-tool-palette-dropdown > ul { + overflow-y: auto; + padding: 0px; + margin: 0px; +} + +.neuroglancer-tool-palette-dropdown + > ul + > li:not(.neuroglancer-tool-palette-dropdown-separator) { + display: flex; + flex-direction: row; + list-style-type: none; + padding: 2px; + font: 10pt sans-serif; +} + +.neuroglancer-tool-palette-dropdown + > ul + > li:not(.neuroglancer-tool-palette-dropdown-separator):hover { + background-color: #333; +} + +.neuroglancer-tool-palette-dropdown-canned-item { + cursor: pointer; +} + +.neuroglancer-tool-palette-dropdown-separator { + height: 1px; + margin-top: 3px; + margin-bottom: 3px; + padding: 0px; + background-color: #ccc; +} + +.neuroglancer-tool-palette-drop-zone { + display: block; + flex: 1; +} + +.neuroglancer-tool-palette-items { + display: flex; + flex-direction: column; + flex-grow: 1; + flex-shrink: 1; + flex-basis: 0px; + font: 10pt sans-serif; + overflow-y: auto; + overflow-x: hidden; +} + +.neuroglancer-tool-palette-tool-container { + display: grid; + grid-template-columns: auto 1fr; + align-items: center; + padding-top: 2px; + padding-bottom: 2px; +} + +.neuroglancer-tool-palette-tool-container:hover { + background-color: #282828; +} + +.neuroglancer-tool-palette-tool-container + > .neuroglancer-tool-palette-tool-content { + grid-row: 1; + grid-column: 2; +} + +.neuroglancer-tool-palette-tool-container + > .neuroglancer-tool-palette-tool-properties { + grid-row: 2; + grid-column: 1/3; +} + +.neuroglancer-tool-palette-tool-container > .neuroglancer-tool-key-binding { + grid-row: 1; + grid-column: 1; +} + +.neuroglancer-tool-palette-tool-delete { + visibility: hidden; +} + +.neuroglancer-tool-palette-tool-container:hover + > .neuroglancer-tool-palette-tool-delete { + visibility: inherit; +} + +.neuroglancer-tool-palette-layer-group-header { + display: flex; + flex-direction: row; + background-color: #181818; + border-bottom: 2px solid black; + position: sticky; + top: 0px; + z-index: 1; +} + +.neuroglancer-tool-palette-layer-group:hover + > .neuroglancer-tool-palette-layer-group-header { + background-color: #282828; +} + +.neuroglancer-tool-palette-layer-group { + border-left: 2px solid #181818; +} + +.neuroglancer-tool-palette-layer-group:hover { + border-left: 2px solid #ccc; +} + +.neuroglancer-tool-palette-body { + display: flex; + flex-direction: column; + flex: 1; +} + +.neuroglancer-tool-palette-body .neuroglancer-multiline-autocomplete-dropdown { + z-index: 2; +} + +.neuroglancer-tool-palette-query-errors { + margin: 0px; + padding: 0px; + margin-bottom: 2px; +} + +.neuroglancer-tool-palette-query-errors > li { + list-style-type: none; + padding: 2px; + font: 10pt sans-serif; + color: red; +} + +.neuroglancer-tool-palette-tool-properties { + display: none; + color: #f9f; + font-style: italic; + user-select: text; +} + +.neuroglancer-tool-palette-show-properties + .neuroglancer-tool-palette-tool-properties { + display: block; +} + +.neuroglancer-tool-to-be-removed { + opacity: 50%; +} diff --git a/src/ui/tool_palette.ts b/src/ui/tool_palette.ts new file mode 100644 index 0000000000..d48764fe3f --- /dev/null +++ b/src/ui/tool_palette.ts @@ -0,0 +1,1310 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/ui/tool_palette.css"; + +import svg_search from "ikonate/icons/search.svg?raw"; +import svg_tool from "ikonate/icons/tool.svg?raw"; +import { debounce } from "lodash-es"; +import type { UserLayer } from "#src/layer/index.js"; +import { + ElementVisibilityFromTrackableBoolean, + TrackableBooleanCheckbox, +} from "#src/trackable_boolean.js"; +import { + makeCachedDerivedWatchableValue, + makeCachedLazyDerivedWatchableValue, + TrackableValue, + WatchableValue, +} from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; +import { LayerVisibilityWidget } from "#src/ui/layer_list_panel.js"; +import { LayerNameWidget } from "#src/ui/layer_side_panel.js"; +import type { + RegisteredSidePanel, + SidePanelManager, +} from "#src/ui/side_panel.js"; +import { SidePanel } from "#src/ui/side_panel.js"; +import type { SidePanelLocation } from "#src/ui/side_panel_location.js"; +import { + DEFAULT_SIDE_PANEL_LOCATION, + TrackableSidePanelLocation, +} from "#src/ui/side_panel_location.js"; +import type { Tool } from "#src/ui/tool.js"; +import { + getMatchingTools, + LayerToolBinder, + restoreTool, + ToolBindingWidget, + updateToolDragDropEffect, +} from "#src/ui/tool.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { toolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { + getPropertyNameCompletions, + getPropertyValueCompletions, + getQueryTermToComplete, + parsePartialToolQuery, + parseToolQuery, +} from "#src/ui/tool_query.js"; +import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; +import { arraysEqual } from "#src/util/array.js"; +import type { Owned } from "#src/util/disposable.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { + updateChildren, + removeFromParent, + removeChildren, +} from "#src/util/dom.js"; +import { + getDropEffectFromModifiers, + getDropEffect, + setDropEffect, +} from "#src/util/drag_and_drop.js"; +import { positionRelativeDropdown } from "#src/util/dropdown.js"; +import { + parseArray, + verifyObject, + verifyOptionalObjectProperty, + verifyString, +} from "#src/util/json.js"; +import { NullarySignal } from "#src/util/signal.js"; +import type { Trackable } from "#src/util/trackable.js"; +import { CompoundTrackable, getCachedJson } from "#src/util/trackable.js"; +import type { Viewer } from "#src/viewer.js"; +import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; +import { makeDeleteButton } from "#src/widget/delete_button.js"; +import { DependentViewWidget } from "#src/widget/dependent_view_widget.js"; +import type { + CompletionResult, + CompletionWithDescription, +} from "#src/widget/multiline_autocomplete.js"; +import { + AutocompleteTextInput, + makeCompletionElementWithDescription, +} from "#src/widget/multiline_autocomplete.js"; +import { TextInputWidget } from "#src/widget/text_input.js"; + +const DEFAULT_TOOL_PALETTE_PANEL_LOCATION: SidePanelLocation = { + ...DEFAULT_SIDE_PANEL_LOCATION, + side: "right", + row: 0, + visible: true, +}; + +function getToolFromJson(viewer: Viewer, toolJson: unknown): Tool | undefined { + verifyObject(toolJson); + const layerName = verifyOptionalObjectProperty( + toolJson, + "layer", + verifyString, + ); + if (layerName !== undefined) { + const { layer: _ignoredLayer, ...adjustedToolJson } = toolJson as any; + const managedLayer = viewer.layerManager.getLayerByName(layerName); + if (managedLayer === undefined) { + return undefined; + } + const userLayer = managedLayer.layer; + if (userLayer === null) { + return undefined; + } + return restoreTool(userLayer, adjustedToolJson); + } else { + return restoreTool(viewer, toolJson); + } +} + +export class TrackableToolList extends RefCounted implements Trackable { + tools: Tool[] = []; + + changed = new NullarySignal(); + + constructor(private viewer: Viewer) { + super(); + } + + get value() { + return this.tools; + } + + reset() { + const { tools } = this; + if (tools.length === 0) return; + for (const tool of tools) { + tool.dispose(); + } + tools.length = 0; + this.changed.dispatch(); + } + + private makeTool(toolJson: unknown): Tool | undefined { + const tool = getToolFromJson(this.viewer, toolJson); + if (tool === undefined) return undefined; + this.initializeTool(tool); + return tool; + } + + private initializeTool(tool: Tool) { + tool.unbound.add(() => { + this.remove(tool); + }); + } + + restoreState(obj: unknown) { + const tools: Tool[] = []; + this.tools = tools; + parseArray(obj, (j) => { + const tool = this.makeTool(j); + if (tool === undefined) return; + tools.push(tool); + }); + this.changed.dispatch(); + } + + insert( + toolJson: unknown, + before: Tool | undefined = undefined, + ): Tool | undefined { + let insertIndex: number; + const { tools } = this; + if (before === undefined) { + insertIndex = tools.length; + } else { + insertIndex = tools.indexOf(before); + } + const tool = this.makeTool(toolJson); + if (tool === undefined) return undefined; + tools.splice(insertIndex, 0, tool); + this.changed.dispatch(); + return tool; + } + + move(source: Tool, before: Tool | undefined) { + const { tools } = this; + const sourceIndex = tools.indexOf(source); + if (sourceIndex === -1) return false; + let targetIndex: number; + if (before === undefined) { + targetIndex = tools.length; + } else { + targetIndex = tools.indexOf(before); + if (targetIndex === -1) return false; + } + if (targetIndex === sourceIndex) return true; + tools.splice(sourceIndex, 1); + if (targetIndex > sourceIndex) { + --targetIndex; + } + tools.splice(targetIndex, 0, source); + this.changed.dispatch(); + return true; + } + + remove(tool: Tool): boolean { + const { tools } = this; + const index = tools.indexOf(tool); + if (index === -1) return false; + tools.splice(index, 1); + tool.dispose(); + this.changed.dispatch(); + return true; + } + + toJSON() { + const { tools } = this; + if (tools.length === 0) return undefined; + return Array.from(tools, (tool) => { + return tool.localBinder.convertLocalJSONToPaletteJSON(tool.toJSON()); + }); + } + + addTools(newTools: Tool[]) { + for (const tool of newTools) { + this.initializeTool(tool); + } + this.tools.push(...newTools); + this.changed.dispatch(); + } + + disposed() { + super.disposed(); + for (const tool of this.tools) { + tool.dispose(); + } + } +} + +export class ToolPaletteState extends RefCounted implements Trackable { + location = new TrackableSidePanelLocation( + DEFAULT_TOOL_PALETTE_PANEL_LOCATION, + ); + + name = new TrackableValue("", verifyString); + + tools: TrackableToolList; + + query = new TrackableValue("", verifyString); + + parsedQuery = this.registerDisposer( + makeCachedLazyDerivedWatchableValue((query) => { + return parseToolQuery(query); + }, this.query), + ); + + queryDefined; + + private trackable = new CompoundTrackable(); + + get changed() { + return this.trackable.changed; + } + + constructor(public viewer: Viewer) { + super(); + this.tools = this.registerDisposer(new TrackableToolList(viewer)); + this.location.changed.add(this.changed.dispatch); + this.name.changed.add(this.changed.dispatch); + this.trackable.add("tools", this.tools); + this.trackable.add("query", this.query); + this.queryDefined = this.registerDisposer( + makeCachedDerivedWatchableValue( + (value) => value.length === 0, + [this.tools], + ), + ); + } + + restoreState(obj: unknown) { + this.location.restoreState(obj); + this.trackable.restoreState(obj); + if (this.query.value !== "") { + this.tools.reset(); + } + } + + reset() { + this.location.reset(); + this.trackable.reset(); + } + + toJSON() { + return { ...this.location.toJSON(), ...this.trackable.toJSON() }; + } +} + +class RenderedLayerGroup extends RefCounted { + element = document.createElement("div"); + header = document.createElement("div"); + content = document.createElement("div"); + firstTool: Tool | undefined; + constructor(public layer: UserLayer) { + super(); + const { element, header, content } = this; + element.classList.add("neuroglancer-tool-palette-layer-group"); + element.appendChild(header); + element.appendChild(content); + header.classList.add("neuroglancer-tool-palette-layer-group-header"); + content.classList.add("neuroglancer-tool-palette-layer-group-content"); + header.appendChild( + this.registerDisposer(new LayerVisibilityWidget(layer.managedLayer)) + .element, + ); + header.appendChild( + this.registerDisposer(new LayerNameWidget(layer.managedLayer)).element, + ); + } +} + +class QueryResults extends RefCounted { + changed = new NullarySignal(); + + private results: Tool[] = []; + private jsonToTool = new Map(); + + constructor(public state: ToolPaletteState) { + super(); + + this.registerDisposer(state.query.changed.add(this.debouncedUpdateResults)); + this.registerDisposer( + state.viewer.globalToolBinder.localBindersChanged.add( + this.debouncedUpdateResults, + ), + ); + + this.updateResults(); + } + + disposed() { + for (const tool of this.jsonToTool.values()) { + tool.dispose(); + } + super.dispose(); + } + + private debouncedUpdateResults = this.registerCancellable( + debounce(() => { + this.updateResults(); + }), + ); + + private getMatches(): Map | undefined { + let triggered = false; + const onChange = () => { + if (triggered) return; + triggered = true; + this.debouncedUpdateResults(); + }; + const parsedQuery = this.state.parsedQuery.value; + if (parsedQuery === undefined) return undefined; + if (!("query" in parsedQuery)) { + return undefined; + } + const matches = getMatchingTools( + this.state.viewer.globalToolBinder, + parsedQuery.query, + onChange, + ); + return matches; + } + + private updateResults() { + const matches = this.getMatches() ?? new Map(); + const { results, jsonToTool } = this; + const newResults: Tool[] = []; + for (const [key, toolJson] of matches) { + let tool = jsonToTool.get(key); + if (tool === undefined) { + tool = getToolFromJson(this.state.viewer, toolJson); + if (tool === undefined) { + continue; + } + jsonToTool.set(key, tool); + } + newResults.push(tool); + } + + for (const [key, tool] of jsonToTool) { + if (!matches.has(key)) { + tool.dispose(); + jsonToTool.delete(key); + } + } + if (!arraysEqual(results, newResults)) { + this.results = newResults; + this.changed.dispatch(); + } + } + + convertToExplicitPalette() { + this.debouncedUpdateResults.flush(); + this.state.query.value = ""; + this.state.tools.addTools(this.results); + this.results.length = 0; + this.jsonToTool.clear(); + } + + get value() { + return this.results; + } +} + +class RenderedTool extends RefCounted { + layerGroup: RenderedLayerGroup | undefined; + element = document.createElement("label")!; + private context: RefCounted | undefined = undefined; + + constructor( + public tool: Tool, + public palette: ToolPalettePanel, + ) { + super(); + const { element } = this; + element.classList.add("neuroglancer-tool-palette-tool-container"); + element.addEventListener("dblclick", () => { + this.tool.unbind(); + }); + element.append( + this.registerDisposer( + new ToolBindingWidget(tool.localBinder, tool.toJSON(), element, { + tool, + palette, + }), + ).element, + ); + this.updateView(); + this.updateTooltip(); + + this.registerDisposer(tool.changed.add(this.debouncedUpdateTooltip)); + this.registerDisposer( + palette.state.queryDefined.changed.add(this.debouncedUpdateTooltip), + ); + } + + private debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + + private debouncedUpdateTooltip = this.registerCancellable( + animationFrameDebounce(() => this.updateTooltip()), + ); + + private updateTooltip() { + let toolJson = this.tool.toJSON(); + if (typeof toolJson === "string") { + toolJson = { type: toolJson }; + } + let text = Object.entries(toolJson) + .map(([key, value]) => `${key}:${value}`) + .join(" "); + if (!this.palette.state.queryDefined.value) { + text += "\nDrag to move/copy, dblclick to remove"; + } else { + text += "\nDrag to copy to another palette"; + } + this.element.title = text; + } + + private updateView() { + let { context } = this; + const { element } = this; + if (context !== undefined) { + context.dispose(); + element.removeChild(element.lastElementChild as Element); + } + this.context = context = new RefCounted(); + const { tool } = this; + let toolElement = this.tool.renderInPalette(context); + if (toolElement === undefined) { + toolElement = document.createElement("div"); + toolElement.textContent = "Loading..."; + if (tool.localBinder instanceof LayerToolBinder) { + context.registerDisposer( + tool.localBinder.context.managedLayer.layerChanged.add( + this.debouncedUpdateView, + ), + ); + } + } + toolElement.classList.add("neuroglancer-tool-palette-tool-content"); + element.appendChild(toolElement); + } + + disposed() { + this.context?.dispose(); + this.layerGroup?.dispose(); + super.disposed(); + } +} + +export class ToolPalettePanel extends SidePanel { + private itemContainer = document.createElement("div"); + private dropZone = document.createElement("div"); + private renderedTools = new Map(); + private dragState: + | { dragSource: ToolDragSource; ephemeralTool: Tool } + | undefined = undefined; + private dragEnterCount = 0; + private queryResults: QueryResults; + + private clearDragState() { + const { dragState } = this; + if (dragState === undefined) return; + this.dragState = undefined; + this.state.tools.remove(dragState.ephemeralTool); + } + + get hasQuery() { + return this.state.query.value !== ""; + } + + private registerDropHandlers( + element: HTMLElement, + getTool: () => Tool | undefined, + ) { + const isDragSourceSupported = () => { + return ( + toolDragSource?.localBinder.globalBinder === + this.manager.state.viewer.globalToolBinder + ); + }; + + const update = (event: DragEvent, updateDropEffect: boolean) => { + if (!isDragSourceSupported()) { + return undefined; + } + if (this.hasQuery) { + this.clearDragState(); + const otherPalette = toolDragSource?.paletteState?.palette; + if ( + updateDropEffect && + otherPalette !== undefined && + otherPalette !== this + ) { + pushDragStatus( + event, + this.itemContainer, + "drop", + "Tools cannot be dropped into a query-defined palette. To allow dropping tools into this palette, first click the magnifying glass icon in the panel titlebar to convert it to a manually-defined palette.", + ); + } + updateToolDragDropEffect(toolDragSource!, "none", false); + return "none"; + } + if (this.dragState?.dragSource !== toolDragSource) { + this.clearDragState(); + } + let dropEffect: "copy" | "move"; + let message: string = ""; + if (updateDropEffect) { + const explicitPaletteSource = + toolDragSource!.paletteState?.palette.state.queryDefined.value === + false; + const result = getDropEffectFromModifiers( + event, + /*defaultDropEffect=*/ explicitPaletteSource ? "move" : "copy", + /*moveAllowed=*/ explicitPaletteSource, + ); + dropEffect = result.dropEffect; + setDropEffect(event, dropEffect); + message = `Drop to ${dropEffect} the tool`; + if (result.dropEffectMessage) { + message += ` (${result.dropEffectMessage})`; + } + } else { + dropEffect = getDropEffect() as "copy" | "move"; + } + + const tool = getTool(); + + const samePalette = toolDragSource!.paletteState?.palette === this; + + if (dropEffect === "copy" || !samePalette) { + const { dragState } = this; + if (dragState === undefined) { + const sourceToolJson = + toolDragSource!.localBinder.convertLocalJSONToPaletteJSON( + toolDragSource!.toolJson, + ); + const ephemeralTool = this.state.tools.insert(sourceToolJson, tool); + if (ephemeralTool === undefined) { + // Unexpected failure + console.error("Failed to create tool: ", toolDragSource!.toolJson); + return undefined; + } + this.dragState = { dragSource: toolDragSource!, ephemeralTool }; + } else { + this.state.tools.move(dragState.ephemeralTool, tool); + } + } else { + this.clearDragState(); + this.state.tools.move(toolDragSource!.paletteState!.tool, tool); + } + + if (updateDropEffect) { + const source = toolDragSource!; + const leaveHandler = () => { + updateToolDragDropEffect(source); + }; + pushDragStatus( + event, + this.itemContainer, + "drop", + message, + leaveHandler, + ); + updateToolDragDropEffect(source, dropEffect, samePalette); + } + return dropEffect; + }; + + const handleDragOver = (event: DragEvent) => { + const updateResult = update(event, /*updateDropEffect=*/ true); + if (updateResult === undefined) { + popDragStatus(event, this.itemContainer, "drop"); + return; + } + event.preventDefault(); + event.stopPropagation(); + }; + element.addEventListener("dragover", handleDragOver); + element.addEventListener("dragenter", (event: DragEvent) => { + ++this.dragEnterCount; + handleDragOver(event); + }); + element.addEventListener("dragleave", (event: DragEvent) => { + if (--this.dragEnterCount !== 0) return; + popDragStatus(event, this.itemContainer, "drop"); + this.clearDragState(); + event.stopPropagation(); + }); + element.addEventListener("drop", (event: DragEvent) => { + event.preventDefault(); + this.dragEnterCount = 0; + popDragStatus(event, this.itemContainer, "drop"); + const updateResult = update(event, /*updateDropEffect=*/ false); + if (updateResult === undefined) { + this.clearDragState(); + return; + } + event.stopPropagation(); + // The "ephemeral tool", if any, is no longer ephemeral. + this.dragState = undefined; + if (updateResult === "move") { + const { paletteState } = toolDragSource!; + if (paletteState !== undefined && paletteState.palette !== this) { + paletteState.palette.state.tools.remove(paletteState.tool); + } + } + }); + } + + constructor( + private manager: MultiToolPaletteManager, + sidePanelManager: SidePanelManager, + public state: ToolPaletteState, + ) { + super(sidePanelManager, state.location); + const { titleBar } = this.addTitleBar({}); + titleBar.appendChild( + this.registerDisposer(new PaletteNameWidget(state.name)).element, + ); + this.queryResults = this.registerDisposer(new QueryResults(state)); + const hasQuery = this.registerDisposer( + makeCachedDerivedWatchableValue((value) => value !== "", [state.query]), + ); + const self = this; + const searchButton = this.registerDisposer( + new CheckboxIcon( + { + changed: hasQuery.changed, + get value() { + return hasQuery.value; + }, + set value(newValue: boolean) { + if (newValue === false && hasQuery.value !== false) { + self.queryResults.convertToExplicitPalette(); + } + }, + }, + { + svg: svg_search, + disableTitle: "Convert query results to an explicit tool palette", + }, + ), + ); + titleBar.appendChild(searchButton.element); + this.registerDisposer( + new ElementVisibilityFromTrackableBoolean(hasQuery, searchButton.element), + ); + const deleteButton = makeDeleteButton({ title: "Delete tool palette" }); + deleteButton.addEventListener("click", () => { + state.dispose(); + }); + titleBar.appendChild(deleteButton); + + const body = document.createElement("div"); + body.classList.add("neuroglancer-tool-palette-body"); + const { itemContainer } = this; + itemContainer.classList.add("neuroglancer-tool-palette-items"); + body.appendChild( + this.registerDisposer( + new DependentViewWidget( + self.state.queryDefined, + (hasQuery: boolean, parent, context) => { + if (!hasQuery) return; + parent.appendChild( + context.registerDisposer(new ToolQueryWidget(state)).element, + ); + }, + ), + ).element, + ); + body.appendChild(itemContainer); + this.addBody(body); + + const { dropZone } = this; + dropZone.classList.add("neuroglancer-tool-palette-drop-zone"); + this.registerDropHandlers(dropZone, () => undefined); + const debouncedRender = this.registerCancellable( + animationFrameDebounce(() => this.render()), + ); + this.registerDisposer(this.state.tools.changed.add(debouncedRender)); + this.registerDisposer(this.queryResults.changed.add(debouncedRender)); + this.visibility.changed.add(debouncedRender); + this.render(); + } + + private getRenderedTool(tool: Tool) { + const { renderedTools } = this; + let renderedTool = renderedTools.get(tool); + if (renderedTool === undefined) { + renderedTool = new RenderedTool(tool, this); + this.registerDropHandlers(renderedTool.element, () => tool); + renderedTools.set(tool, renderedTool); + } + return renderedTool; + } + + override getDragDropDescription() { + return "tool palette"; + } + + override canCopy() { + return true; + } + + override copyToNewLocation(location: SidePanelLocation) { + const newPalette = this.manager.state.addNew({ + location: { ...this.state.location.value, ...location }, + name: this.state.name.value, + }); + newPalette.tools.restoreState(this.state.tools.toJSON() ?? []); + newPalette.query.value = this.state.query.value; + } + + render() { + const self = this; + function* getItems() { + const tools = self.state.queryDefined.value + ? self.queryResults.value + : self.state.tools.tools; + const { renderedTools } = self; + const seenTools = new Set(tools); + const numTools = tools.length; + const seenLayerGroups = new Set(); + for (let toolIndex = 0; toolIndex < numTools; ) { + let tool = tools[toolIndex]; + const { localBinder } = tool; + if (localBinder instanceof LayerToolBinder) { + const layer: UserLayer = localBinder.context; + + let renderedTool = self.getRenderedTool(tool); + + let { layerGroup } = renderedTool; + if (seenLayerGroups.has(layerGroup) || layerGroup === undefined) { + layerGroup = new RenderedLayerGroup(layer); + self.registerDropHandlers( + layerGroup.header, + () => layerGroup!.firstTool, + ); + layerGroup.firstTool = tool; + } else { + layerGroup.addRef(); + } + seenLayerGroups.add(layerGroup); + + // Fill layer group. + function* getGroupItems() { + while (true) { + renderedTool.layerGroup?.dispose(); + renderedTool.layerGroup = layerGroup!.addRef(); + yield renderedTool.element; + if ( + ++toolIndex === numTools || + (tool = tools[toolIndex]).localBinder !== localBinder + ) { + break; + } + renderedTool = self.getRenderedTool(tool); + } + } + updateChildren(layerGroup.content, getGroupItems()); + yield layerGroup.element; + layerGroup.dispose(); + } else { + const renderedTool = self.getRenderedTool(tool); + yield renderedTool.element; + ++toolIndex; + } + } + for (const [tool, renderedTool] of renderedTools) { + if (!seenTools.has(tool)) { + renderedTool.dispose(); + renderedTools.delete(tool); + } + } + + yield self.dropZone; + } + updateChildren(this.itemContainer, getItems()); + } + + disposed() {} +} + +class ToolQueryWidget extends RefCounted { + element = document.createElement("div"); + errorsElement = document.createElement("ul"); + constructor(public state: ToolPaletteState) { + super(); + + const textInput = this.registerDisposer( + new AutocompleteTextInput({ + completer: this.completeQuery.bind(this), + }), + ); + textInput.placeholder = "Enter tool query or drag in tools"; + textInput.element.classList.add("neuroglancer-tool-palette-query"); + textInput.value = state.query.value ?? ""; + + this.registerDisposer( + state.parsedQuery.changed.add( + this.registerCancellable(debounce(() => this.updateErrors(), 200)), + ), + ); + this.updateErrors(); + textInput.onCommit.add(() => { + state.query.value = textInput.value; + }); + state.query.changed.add(() => { + textInput.value = state.query.value ?? ""; + }); + const { element, errorsElement } = this; + element.appendChild(textInput.element); + element.appendChild(errorsElement); + errorsElement.classList.add("neuroglancer-tool-palette-query-errors"); + } + + private updateErrors() { + const { errorsElement } = this; + removeChildren(errorsElement); + const query = this.state.parsedQuery.value; + if (query === undefined || !("errors" in query)) return; + for (const error of query.errors) { + const element = document.createElement("li"); + element.textContent = error.message; + errorsElement.appendChild(element); + } + } + + private async completeQuery({ + value, + }: { + value: string; + }): Promise { + const parsed = parsePartialToolQuery(value); + const info = getQueryTermToComplete(parsed); + + const matches = getMatchingTools( + this.state.viewer.globalToolBinder, + info.completionQuery, + ); + + let completions: [string, number][]; + if (info.property === undefined) { + completions = getPropertyNameCompletions( + info.completionQuery, + matches, + info.prefix, + ); + } else { + completions = getPropertyValueCompletions(matches, info.property); + } + const completionEntries: CompletionWithDescription[] = []; + if (info.property === undefined && info.prefix === "") { + if ( + parsed.query.clauses.length > 0 && + parsed.query.clauses[parsed.query.clauses.length - 1].terms.length !== 0 + ) { + completionEntries.push({ + value: "+", + description: "New inclusion clause", + }); + completionEntries.push({ + value: "-", + description: "New exclusion clause", + }); + } + } + + for (const [value, count] of completions) { + completionEntries.push({ + value, + description: `${count} tool${count > 0 ? "s" : ""}`, + }); + } + return { + offset: info.offset, + completions: completionEntries, + makeElement: makeCompletionElementWithDescription, + }; + } +} + +export class MultiToolPaletteState implements Trackable { + changed = new NullarySignal(); + changedShallow = new NullarySignal(); + visibleStateChanged = new NullarySignal(); + palettes = new Set(); + + constructor(public viewer: Viewer) {} + + add(palette: Owned) { + this.palettes.add(palette); + palette.registerDisposer(palette.changed.add(this.changed.dispatch)); + palette.registerDisposer( + palette.location.watchableVisible.changed.add( + this.visibleStateChanged.dispatch, + ), + ); + palette.registerDisposer( + palette.name.changed.add(() => this.checkTitles(palette)), + ); + palette.registerDisposer(() => { + this.palettes.delete(palette); + this.changedShallow.dispatch(); + this.visibleStateChanged.dispatch(); + this.changed.dispatch(); + }); + this.changedShallow.dispatch(); + this.changed.dispatch(); + } + + toJSON() { + const { palettes } = this; + if (palettes.size === 0) { + return undefined; + } + const json: any = {}; + for (const palette of palettes) { + json[palette.name.value] = getCachedJson(palette).value; + } + return json; + } + + reset() { + const { palettes } = this; + if (palettes.size !== 0) { + for (const palette of palettes) { + palette.dispose(); + } + } + } + + restoreState(obj: unknown) { + if (obj === undefined) { + return; + } + verifyObject(obj); + const { viewer } = this; + const names = new Map(); + for (const palette of this.palettes) { + names.set(palette.name.value, palette); + } + for (const [name, json] of Object.entries(obj as object)) { + const existing = names.get(name); + if (existing !== undefined) { + existing.restoreState(json); + continue; + } + const palette = new ToolPaletteState(viewer); + palette.name.value = name; + palette.restoreState(json); + names.set(name, palette); + this.add(palette); + } + } + + addNew( + options: { location?: Partial; name?: string } = {}, + ) { + const palette = new ToolPaletteState(this.viewer); + const { location, name = "Palette" } = options; + palette.name.value = name; + this.checkTitles(palette); + palette.location.value = { + ...DEFAULT_TOOL_PALETTE_PANEL_LOCATION, + ...location, + }; + palette.location.locationChanged.dispatch(); + this.add(palette); + return palette; + } + + // Ensures all palette titles are unique. + private checkingTitles = false; + private checkTitles(changedPalette: ToolPaletteState) { + if (this.checkingTitles) return; + try { + this.checkingTitles = true; + const titles = new Set(); + for (const palette of this.palettes) { + if (palette === changedPalette) continue; + titles.add(palette.name.value); + } + const title = changedPalette.name.value; + if (!titles.has(title)) return; + let suffix = 0; + while (true) { + const modifiedTitle = title + ++suffix; + if (!titles.has(modifiedTitle)) { + changedPalette.name.value = modifiedTitle; + return; + } + } + } finally { + this.checkingTitles = false; + } + } +} + +export class MultiToolPaletteManager extends RefCounted { + private panels = new Map(); + constructor( + private sidePanelManager: SidePanelManager, + public state: MultiToolPaletteState, + ) { + super(); + const debouncedUpdatePanels = this.registerCancellable( + animationFrameDebounce(() => this.updatePanels()), + ); + this.registerDisposer(this.state.changedShallow.add(debouncedUpdatePanels)); + this.updatePanels(); + } + + private updatePanels() { + const { panels } = this; + const { palettes } = this.state; + for (const [palette, panel] of panels) { + if (!palettes.has(palette)) { + this.sidePanelManager.unregisterPanel(panel); + panels.delete(palette); + } + } + + for (const palette of palettes) { + if (!panels.has(palette)) { + const panel = { + location: palette.location, + makePanel: () => + new ToolPalettePanel(this, this.sidePanelManager, palette), + }; + panels.set(palette, panel); + this.sidePanelManager.registerPanel(panel); + } + } + } + + disposed() { + super.disposed(); + for (const panel of this.panels.values()) { + this.sidePanelManager.unregisterPanel(panel); + } + } +} + +export class PaletteNameWidget extends TextInputWidget { + constructor(public name: TrackableValue) { + super(name); + const { element } = this; + element.classList.add("neuroglancer-tool-palette-name"); + element.title = "Rename tool palette"; + } +} + +export class PaletteListDropdownItem extends RefCounted { + element = document.createElement("li"); + constructor(public state: ToolPaletteState) { + super(); + const { element } = this; + element.appendChild( + this.registerDisposer( + new TrackableBooleanCheckbox(state.location.watchableVisible, { + enableTitle: "Show tool palette", + disableTitle: "Hide tool palette", + }), + ).element, + ); + element.appendChild( + this.registerDisposer(new PaletteNameWidget(state.name)).element, + ); + const deleteButton = makeDeleteButton({ title: "Delete tool palette" }); + deleteButton.addEventListener("click", () => { + state.dispose(); + }); + element.appendChild(deleteButton); + } +} + +interface CannedPalette { + name: string; + description?: string; + query: string; +} + +class PaletteListCannedDropdownItem { + element = document.createElement("li"); + constructor( + public state: MultiToolPaletteState, + public palette: CannedPalette, + ) { + const { element } = this; + element.classList.add("neuroglancer-tool-palette-dropdown-canned-item"); + element.textContent = palette.description ?? palette.name; + element.addEventListener("click", () => { + const newPalette = state.addNew({ name: palette.name }); + newPalette.query.value = palette.query; + }); + } +} + +export const CANNED_PALETTES: CannedPalette[] = [ + { name: "Palette", description: "New empty palette", query: "" }, + { name: "All controls", query: "+" }, + { name: "Shader controls", query: "type:shaderControl" }, +]; + +export class MultiToolPaletteDropdown extends RefCounted { + element = document.createElement("div"); + itemContainer = document.createElement("ul"); + items = new Map(); + cannedItems = new Map(); + cannedItemSeparator = document.createElement("li"); + constructor(private state: MultiToolPaletteState) { + super(); + const { element, itemContainer, cannedItemSeparator } = this; + element.classList.add("neuroglancer-tool-palette-dropdown"); + + cannedItemSeparator.classList.add( + "neuroglancer-tool-palette-dropdown-separator", + ); + + element.appendChild(itemContainer); + const debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + this.registerDisposer(this.state.changedShallow.add(debouncedUpdateView)); + this.updateView(); + } + + private updateView() { + const self = this; + function* getItems() { + const { palettes } = self.state; + const seenQueries = new Set(); + const { items } = self; + for (const palette of palettes) { + let item = items.get(palette); + if (item === undefined) { + item = new PaletteListDropdownItem(palette); + items.set(palette, item); + } + seenQueries.add(palette.query.value); + yield item.element; + } + let firstCannedItem = true; + const { cannedItems } = self; + for (const palette of CANNED_PALETTES) { + if (palette.query !== "" && seenQueries.has(palette.query)) { + continue; + } + let item = cannedItems.get(palette); + if (item === undefined) { + item = new PaletteListCannedDropdownItem(self.state, palette); + cannedItems.set(palette, item); + } + if (firstCannedItem) { + firstCannedItem = false; + if (palettes.size !== 0) { + yield self.cannedItemSeparator; + } + } + yield item.element; + } + for (const [palette, item] of items) { + if (!palettes.has(palette)) { + items.delete(palette); + item.dispose(); + } + } + } + updateChildren(this.itemContainer, getItems()); + } + + disposed() { + super.disposed(); + removeFromParent(this.element); + } +} + +export class MultiToolPaletteDropdownButton extends RefCounted { + countElement = document.createElement("div"); + dropdownVisible = new WatchableValue(false); + dropdown: MultiToolPaletteDropdown | undefined; + element = document.createElement("div"); + constructor(private state: MultiToolPaletteState) { + super(); + const { element, countElement } = this; + + const checkbox = this.registerDisposer( + new CheckboxIcon(this.dropdownVisible, { + svg: svg_tool, + enableTitle: "Show tool palette list (control+click to create new)", + disableTitle: "Hide tool palette list", + backgroundScheme: "dark", + }), + ).element; + element.appendChild(checkbox); + element.classList.add("neuroglancer-tool-palette-button"); + element.classList.add("neuroglancer-sticky-focus"); + element.tabIndex = -1; + + const debouncedUpdateView = this.registerCancellable( + animationFrameDebounce(() => this.updateView()), + ); + this.registerDisposer(state.changedShallow.add(debouncedUpdateView)); + this.registerDisposer(state.visibleStateChanged.add(debouncedUpdateView)); + + element.addEventListener("focusout", (event) => { + const { relatedTarget } = event; + if (relatedTarget instanceof Node && !element.contains(relatedTarget)) { + this.dropdownVisible.value = false; + } + }); + checkbox.insertAdjacentElement("afterbegin", countElement); + this.dropdownVisible.changed.add(() => { + const visible = this.dropdownVisible.value; + if (!visible) { + this.dropdown?.dispose(); + this.dropdown = undefined; + } else { + if (this.dropdown === undefined) { + this.dropdown = new MultiToolPaletteDropdown(this.state); + this.element.appendChild(this.dropdown.element); + positionRelativeDropdown(this.dropdown.element, this.element); + } + } + }); + this.updateView(); + } + + private updateView() { + const totalPalettes = this.state.palettes.size; + let visiblePalettes = 0; + for (const palette of this.state.palettes) { + if (palette.location.visible) ++visiblePalettes; + } + this.countElement.textContent = + visiblePalettes < totalPalettes + ? `${visiblePalettes}/${totalPalettes}` + : ""; + } + + disposed() { + this.dropdown?.dispose(); + } +} diff --git a/src/ui/tool_query.spec.ts b/src/ui/tool_query.spec.ts new file mode 100644 index 0000000000..3960bfca62 --- /dev/null +++ b/src/ui/tool_query.spec.ts @@ -0,0 +1,322 @@ +import { describe, test, expect } from "vitest"; +import { + getCompletionOffset, + getQueryTermToComplete, + parsePartialToolQuery, + parseToolQuery, +} from "#src/ui/tool_query.js"; + +describe("parseQuery", () => { + test("simple term", () => { + expect(parseToolQuery("type:shaderControl")).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 18, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 0, + "end": 18, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("multiple terms", () => { + expect(parseToolQuery("+type:shaderControl layer:image")) + .toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 31, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 1, + "end": 19, + }, + }, + { + "predicate": { + "equals": "image", + }, + "property": "layer", + "range": { + "begin": 20, + "end": 31, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("multiple clauses", () => { + expect(parseToolQuery("+type:shaderControl -layer:image")) + .toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 19, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 1, + "end": 19, + }, + }, + ], + }, + { + "include": false, + "range": { + "begin": 20, + "end": 32, + }, + "terms": [ + { + "predicate": { + "equals": "image", + }, + "property": "layer", + "range": { + "begin": 21, + "end": 32, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("quoted value", () => { + expect(parseToolQuery(`type:"shaderControl"`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 20, + }, + "terms": [ + { + "predicate": { + "equals": "shaderControl", + }, + "property": "type", + "range": { + "begin": 0, + "end": 20, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("regexp value", () => { + expect(parseToolQuery(`type:/shaderControl/`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 20, + }, + "terms": [ + { + "predicate": { + "regexp": /shaderControl/i, + }, + "property": "type", + "range": { + "begin": 0, + "end": 20, + }, + }, + ], + }, + ], + }, + } + `); + }); + + test("invalid term", () => { + expect(parseToolQuery(`a`)).toMatchInlineSnapshot(` + { + "errors": [ + { + "message": "Invalid clause/term", + "range": { + "begin": 0, + "end": 1, + }, + }, + ], + } + `); + }); + + test("empty clause", () => { + expect(parseToolQuery(`+`)).toMatchInlineSnapshot(` + { + "query": { + "clauses": [ + { + "include": true, + "range": { + "begin": 0, + "end": 1, + }, + "terms": [], + }, + ], + }, + } + `); + }); + + test("duplicate property", () => { + expect(parseToolQuery("type:shaderControl type:shaderControl")) + .toMatchInlineSnapshot(` + { + "errors": [ + { + "message": "Property "type" cannot be constrained by more than one term in a clause", + "range": { + "begin": 19, + "end": 23, + }, + }, + ], + } + `); + }); +}); + +describe("getCompletionOffset", () => { + test("property value", () => { + expect( + getCompletionOffset(parsePartialToolQuery("layerType:im")), + ).toMatchInlineSnapshot(`0`); + }); +}); + +describe("getQueryTermToComplete", () => { + test("property value", () => { + expect(getQueryTermToComplete(parsePartialToolQuery("layerType:im"))) + .toMatchInlineSnapshot(` + { + "completionQuery": { + "clauses": [ + { + "include": true, + "range": { + "begin": -1, + "end": -1, + }, + "terms": [ + { + "predicate": { + "regexp": /\\^im/, + }, + "property": "layerType", + "range": { + "begin": -1, + "end": -1, + }, + }, + ], + }, + ], + }, + "include": true, + "offset": 10, + "prefix": "im", + "property": "layerType", + } + `); + }); + + test("property name after existing term", () => { + expect(getQueryTermToComplete(parsePartialToolQuery("layerType:image j"))) + .toMatchInlineSnapshot(` + { + "completionQuery": { + "clauses": [ + { + "include": true, + "range": { + "begin": -1, + "end": -1, + }, + "terms": [ + { + "predicate": { + "equals": "image", + }, + "property": "layerType", + "range": { + "begin": 0, + "end": 15, + }, + }, + ], + }, + ], + }, + "include": true, + "offset": 16, + "prefix": "j", + "property": undefined, + } + `); + }); +}); diff --git a/src/ui/tool_query.ts b/src/ui/tool_query.ts new file mode 100644 index 0000000000..6443895124 --- /dev/null +++ b/src/ui/tool_query.ts @@ -0,0 +1,353 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { escapeRegExp } from "lodash-es"; +import { defaultStringCompare } from "#src/util/string.js"; + +export type PropertyPredicate = { equals: string } | { regexp: RegExp }; + +export interface QueryRange { + begin: number; + end: number; +} + +export interface QueryTerm { + // Start offset in query string; + range: QueryRange; + property: string; + predicate: PropertyPredicate; +} + +// A clause specifies a conjunction (AND) of terms. All tools matching the +// clause are either included or excluded from the overall results. +export interface QueryClause { + // Indicates if this clause is an inclusion or an exclusion. + include: boolean; + range: QueryRange; + terms: QueryTerm[]; +} + +// A query specifies an ordered list of inclusion/exclusion clauses. +export interface Query { + clauses: QueryClause[]; +} + +export interface ParseError { + range: QueryRange; + message: string; +} + +const TOKEN_PATTERN = + /^(\s*)(?:(\+|-)|([a-zA-Z]+):(?:("(?:[^"\\]|\\.)*")|([^\s"/][^\s"]*)|\/((?:[^/\\]|\\.)*)\/)(?=$|\s))/; + +export interface PartialQuery { + raw: string; + query: Query; + errors: ParseError[]; + endOffset: number; +} + +export function parsePartialToolQuery(query: string): PartialQuery { + let offset = 0; + const raw = query; + + const parsedQuery: Query = { clauses: [] }; + let currentClause: QueryClause | undefined; + + const errors: ParseError[] = []; + + const endClause = () => { + if (currentClause === undefined) return; + if (currentClause.terms.length === 0) { + if (currentClause.include === false) { + errors.push({ + range: { begin: currentClause.range.begin, end: offset }, + message: "Exclusion clause must have at least one term", + }); + } + currentClause.range.end = offset; + parsedQuery.clauses.push(currentClause); + } else { + currentClause.range.end = + currentClause.terms[currentClause.terms.length - 1].range.end; + parsedQuery.clauses.push(currentClause); + } + }; + + for (let nextOffset: number; true; offset = nextOffset) { + // Parse include/exclude token. + const tokenMatch = query.match(TOKEN_PATTERN); + + if (tokenMatch === null) { + break; + } + + const matchLength = tokenMatch[0].length; + nextOffset = offset + matchLength; + query = query.substring(matchLength); + + const skipLength = tokenMatch[1].length; + + const includeExclude = tokenMatch[2]; + if (includeExclude !== undefined) { + // New clause + endClause(); + currentClause = { + range: { begin: offset + skipLength, end: -1 }, + include: includeExclude === "+", + terms: [], + }; + continue; + } + + const propertyName = tokenMatch[3]; + if (currentClause === undefined) { + currentClause = { + range: { begin: offset + skipLength, end: -1 }, + include: true, + terms: [], + }; + } else { + // Check that property is not already present in this clause. + if ( + currentClause.terms.find((term) => term.property === propertyName) !== + undefined + ) { + errors.push({ + range: { + begin: offset + skipLength, + end: offset + skipLength + propertyName.length, + }, + message: `Property ${JSON.stringify(propertyName)} cannot be constrained by more than one term in a clause`, + }); + } + } + + let predicate: PropertyPredicate; + + const quoted = tokenMatch[4]; + if (quoted !== undefined) { + predicate = { equals: JSON.parse(quoted) }; + } else { + const unquoted = tokenMatch[5]; + if (unquoted !== undefined) { + predicate = { equals: unquoted }; + } else { + try { + const regexp = new RegExp(tokenMatch[6], "i"); + predicate = { regexp }; + } catch (e) { + errors.push({ + range: { + begin: offset + skipLength + propertyName.length + 2, + end: nextOffset - 1, + }, + message: (e as SyntaxError).message, + }); + predicate = { equals: "" }; + } + } + } + + currentClause.terms.push({ + range: { begin: offset + skipLength, end: nextOffset }, + property: propertyName, + predicate, + }); + continue; + } + + endClause(); + + // Skip whitespace before ending parsing. + { + const m = query.match(/^\s*/); + if (m !== null) { + offset += m[0].length; + } + } + + return { raw, query: parsedQuery, errors, endOffset: offset }; +} + +export function parseToolQuery( + query: string, +): { query: Query } | { errors: ParseError[] } { + const result = parsePartialToolQuery(query); + if (result.endOffset !== query.length) { + result.errors.push({ + range: { begin: result.endOffset, end: query.length }, + message: "Invalid clause/term", + }); + } + if (result.errors.length > 0) { + return { errors: result.errors }; + } + return { query: result.query }; +} + +export function matchPredicate(predicate: PropertyPredicate, value: string) { + if ("equals" in predicate) { + return predicate.equals === value; + } else { + return value.match(predicate.regexp) !== null; + } +} + +export function matchesTerms(toolJson: any, terms: QueryTerm[]) { + for (const term of terms) { + const value = toolJson[term.property]; + if (typeof value !== "string") return false; + if (!matchPredicate(term.predicate, value)) return false; + } + return true; +} + +export interface QueryCompletion { + offset: number; + prefix: string; + property?: string; + include: boolean; + completionQuery: Query; +} + +export function getCompletionOffset(query: PartialQuery): number { + const { clauses } = query.query; + if (query.endOffset === query.raw.length && clauses.length !== 0) { + const { range, terms } = clauses[clauses.length - 1]; + if (range.end === query.endOffset && terms.length !== 0) { + const lastTerm = terms[terms.length - 1]; + // Remove last term since it will be completed. + terms.length = terms.length - 1; + return lastTerm.range.begin; + } + } + + return query.endOffset; +} + +const PARTIAL_TERM_PATTERN = /^([a-zA-Z]+):/; + +export function getQueryTermToComplete(query: PartialQuery): QueryCompletion { + const termOffset = getCompletionOffset(query); + let prefix = query.raw.substring(termOffset); + let property: string | undefined; + const m = prefix.match(PARTIAL_TERM_PATTERN); + + const include = + query.query.clauses.length == 0 || + query.query.clauses[query.query.clauses.length - 1].include; + let offset: number; + if (m === null) { + offset = termOffset; + } else { + offset = termOffset + m[1].length + 1; + property = m[1]; + prefix = prefix.substring(m[1].length + 1); + } + + const completionQuery: Query = { clauses: [] }; + + const { clauses } = query.query; + const currentTerms: QueryTerm[] = []; + if (clauses.length !== 0) { + currentTerms.push(...clauses[clauses.length - 1].terms); + } + if (property !== undefined) { + currentTerms.push({ + property, + predicate: { regexp: new RegExp("^" + escapeRegExp(prefix)) }, + range: { begin: -1, end: -1 }, + }); + } + + if (include) { + completionQuery.clauses.push({ + include: true, + terms: currentTerms, + range: { begin: -1, end: -1 }, + }); + + // All other clauses are inverted + for (let i = 0, numClauses = clauses.length - 1; i < numClauses; ++i) { + const clause = clauses[i]; + completionQuery.clauses.push({ + include: !clause.include, + terms: clause.terms, + range: clause.range, + }); + } + } else { + for (let i = 0, numClauses = clauses.length - 1; i < numClauses; ++i) { + const clause = clauses[i]; + let terms = clause.terms; + if (clause.include) { + terms = [...terms, ...currentTerms]; + } + completionQuery.clauses.push({ + include: clause.include, + terms, + range: clause.range, + }); + } + } + return { offset, prefix, property, include, completionQuery }; +} + +function getSortedCompletions(values: Map) { + const result = Array.from(values); + result.sort((a, b) => defaultStringCompare(a[0], b[0])); + return result; +} + +export function getPropertyNameCompletions( + completionQuery: Query, + matches: Map, + prefix: string, +) { + const existingPropertyNames = new Set( + Array.from(completionQuery.clauses[0].terms, (term) => term.property), + ); + const properties = new Map(); + for (const match of matches.values()) { + for (const property in match) { + if (!property.startsWith(prefix) || existingPropertyNames.has(property)) { + continue; + } + const value = property + ":"; + const existing = properties.get(value) ?? 0; + properties.set(value, existing + 1); + } + } + return getSortedCompletions(properties); +} + +export function getPropertyValueCompletions( + matches: Map, + property: string, +) { + const values = new Map(); + for (const match of matches.values()) { + const value = "" + match[property]; + const existing = values.get(value) ?? 0; + values.set(value, existing + 1); + } + return getSortedCompletions(values); +} + +export const INCLUDE_EVERYTHING_QUERY: Query = { + clauses: [{ include: true, terms: [], range: { begin: -1, end: -1 } }], +}; diff --git a/src/ui/url_hash_binding.ts b/src/ui/url_hash_binding.ts index 5c338cb5e7..978942494c 100644 --- a/src/ui/url_hash_binding.ts +++ b/src/ui/url_hash_binding.ts @@ -15,16 +15,11 @@ */ import { debounce } from "lodash-es"; -import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; import { StatusMessage } from "#src/status.js"; import { WatchableValue } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; -import { responseJson } from "#src/util/http_request.js"; import { urlSafeParse, verifyObject } from "#src/util/json.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; import type { Trackable } from "#src/util/trackable.js"; import { getCachedJson } from "#src/util/trackable.js"; @@ -71,7 +66,7 @@ export class UrlHashBinding extends RefCounted { constructor( public root: Trackable, - public credentialsManager: CredentialsManager, + public sharedKvStoreContext: SharedKvStoreContext, options: UrlHashBindingOptions = {}, ) { super(); @@ -122,21 +117,15 @@ export class UrlHashBinding extends RefCounted { // Handle remote JSON state if (s.match(/^#!([a-z][a-z\d+-.]*):\/\//)) { const url = s.substring(2); - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - this.credentialsManager, - ); StatusMessage.forPromise( - cancellableFetchSpecialOk( - credentialsProvider, - parsedUrl, - {}, - responseJson, - ).then((json) => { - verifyObject(json); - this.root.reset(); - this.root.restoreState(json); - }), + this.sharedKvStoreContext.kvStoreContext + .read(url, { throwIfMissing: true }) + .then((response) => response.response.json()) + .then((json) => { + verifyObject(json); + this.root.reset(); + this.root.restoreState(json); + }), { initialMessage: `Loading state from ${url}`, errorPrefix: "Error loading state:", diff --git a/src/util/abort.spec.ts b/src/util/abort.spec.ts new file mode 100644 index 0000000000..06ca844922 --- /dev/null +++ b/src/util/abort.spec.ts @@ -0,0 +1,91 @@ +/** + * @license + * Copyright 2016 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, test } from "vitest"; +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; + +describe("SharedAbortController", () => { + test("supports abort from two consumers", async () => { + const sharedController = new SharedAbortController(); + const controller1 = new AbortController(); + sharedController.addConsumer(controller1.signal); + const controller2 = new AbortController(); + sharedController.addConsumer(controller2.signal); + controller1.abort(); + expect(sharedController.signal.aborted).toBe(false); + expect(sharedController.signal.aborted).toBe(false); + controller2.abort(); + expect(sharedController.signal.aborted).toBe(true); + }); + + test("supports undefined AbortSignal", async () => { + const sharedController = new SharedAbortController(); + const controller1 = new AbortController(); + sharedController.addConsumer(controller1.signal); + sharedController.addConsumer(undefined); + controller1.abort(); + await Promise.resolve(); + expect(sharedController.signal.aborted).toBe(false); + }); + + test("supports dispose", async () => { + const controller1 = new AbortController(); + let called = false; + { + using sharedController = new SharedAbortController(); + sharedController.addConsumer(controller1.signal); + sharedController.signal.addEventListener("abort", () => { + called = true; + }); + } + expect(called).toBe(false); + controller1.abort(); + expect(called).toBe(false); + }); +}); + +describe("raceWithAbort", () => { + test("undefined signal", () => { + const promise = Promise.resolve(5); + expect(raceWithAbort(promise, undefined)).toBe(promise); + }); + + test("already aborted signal", async () => { + const controller = new AbortController(); + controller.abort(); + const promise = new Promise((_resolve, _reject) => {}); + await expect(() => + raceWithAbort(promise, controller.signal), + ).rejects.toThrowError(/aborted/); + }); + + test("not abort signal", async () => { + const controller = new AbortController(); + controller.abort(); + const promise = new Promise((_resolve, _reject) => {}); + await expect(() => + raceWithAbort(promise, controller.signal), + ).rejects.toThrowError(/aborted/); + }); + + test("aborted later signal", async () => { + const controller = new AbortController(); + const promise = new Promise((_resolve, _reject) => {}); + const wrappedPromise = raceWithAbort(promise, controller.signal); + controller.abort(); + await expect(() => wrappedPromise).rejects.toThrowError(/aborted/); + }); +}); diff --git a/src/util/abort.ts b/src/util/abort.ts new file mode 100644 index 0000000000..da3b37908f --- /dev/null +++ b/src/util/abort.ts @@ -0,0 +1,137 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function scopedAbortCallback( + signal: AbortSignal | undefined, + callback: (reason: any) => void, +): Disposable | undefined { + if (signal === undefined) return undefined; + if (signal.aborted) { + callback(signal.reason); + return undefined; + } + function wrappedCallback(this: AbortSignal) { + callback(this.reason); + } + signal.addEventListener("abort", wrappedCallback, { once: true }); + return { + [Symbol.dispose]() { + signal.removeEventListener("abort", wrappedCallback); + }, + }; +} + +// Abort controller that aborts when *all* consumers have aborted. +export class SharedAbortController { + private consumers = new Map<(this: AbortSignal) => void, AbortSignal>(); + private controller = new AbortController(); + private retainCount = 0; + + get signal(): AbortSignal { + return this.controller.signal; + } + + addConsumer(signal: AbortSignal | undefined): void { + if (this.controller.signal.aborted) return undefined; + if (signal !== undefined) { + if (signal.aborted) return; + const self = this; + function wrappedCallback(this: AbortSignal) { + self.consumers.delete(wrappedCallback); + if (--self.retainCount === 0) { + self.controller.abort(); + self[Symbol.dispose](); + } + } + signal.addEventListener("abort", wrappedCallback, { once: true }); + } + ++this.retainCount; + } + + [Symbol.dispose](): void { + for (const [wrappedCallback, signal] of this.consumers) { + signal.removeEventListener("abort", wrappedCallback); + } + this.consumers.clear(); + this.retainCount = 0; + } + + // Marks this controller as started. Aborts if there are no consumers. + start(): void { + if (this.retainCount === 0) { + this.controller.abort(); + } + } +} + +export function promiseWithResolversAndAbortCallback( + signal: AbortSignal, + abortCallback: (reason: any) => void, +): { + promise: Promise; + resolve: (value: T) => void; + reject: (reason: any) => void; +} { + const { promise, resolve, reject } = Promise.withResolvers(); + const cleanup = scopedAbortCallback(signal, abortCallback); + return { + promise, + resolve: (value: T) => { + cleanup?.[Symbol.dispose](); + resolve(value); + }, + reject: (reason: any) => { + cleanup?.[Symbol.dispose](); + reject(reason); + }, + }; +} + +export function raceWithAbort( + promise: Promise, + signal: AbortSignal | undefined, +): Promise { + if (signal === undefined) return promise; + if (signal.aborted) return Promise.reject(signal.reason); + + return new Promise((resolve, reject) => { + const cleanup = scopedAbortCallback(signal, (reason) => { + reject(reason); + }); + promise.then( + (value) => { + cleanup?.[Symbol.dispose](); + resolve(value); + }, + (reason) => { + cleanup?.[Symbol.dispose](); + reject(reason); + }, + ); + }); +} + +export function abortPromise(signal: AbortSignal) { + return new Promise((_resolve, reject) => { + signal.addEventListener( + "abort", + () => { + reject(signal.reason); + }, + { once: true }, + ); + }); +} diff --git a/src/util/array.ts b/src/util/array.ts index c18e90cc87..64d30a29a2 100644 --- a/src/util/array.ts +++ b/src/util/array.ts @@ -63,35 +63,42 @@ export function filterArrayInplace( array.length = outIndex; } -export type TypedArrayConstructor = - | typeof Int8Array - | typeof Uint8Array - | typeof Int16Array - | typeof Uint16Array - | typeof Int32Array - | typeof Uint32Array - | typeof Float32Array - | typeof Float64Array; +export type TypedArrayConstructor< + TArrayBuffer extends ArrayBufferLike = ArrayBufferLike, +> = ( + | typeof Int8Array + | typeof Uint8Array + | typeof Int16Array + | typeof Uint16Array + | typeof Int32Array + | typeof Uint32Array + | typeof Float32Array + | typeof Float64Array +) & + (TArrayBuffer extends ArrayBuffer + ? { new (count: number): TypedArray } + : Record); -export type TypedArray = - | Int8Array - | Uint8Array - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array; +export type TypedArray = + + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; /** * Returns an array of size newSize that starts with the contents of array. * Either returns array if it has the correct size, or a new array with zero * padding at the end. */ -export function maybePadArray( - array: T, - newSize: number, -): T { +export function maybePadArray< + TArrayBuffer extends ArrayBufferLike, + T extends TypedArray, +>(array: T, newSize: number): T { if (array.length === newSize) { return array; } @@ -163,13 +170,13 @@ export function tile2dArray( return result; } -export function binarySearch( - haystack: ArrayLike, - needle: T, - compare: (a: T, b: T) => number, +export function binarySearch( + haystack: ArrayLike, + needle: Needle, + compare: (a: Needle, b: Hay) => number, low = 0, high = haystack.length, -) { +): number { while (low < high) { const mid = (low + high - 1) >> 1; const compareResult = compare(needle, haystack[mid]); diff --git a/src/util/byte_range_http_requests.ts b/src/util/byte_range_http_requests.ts deleted file mode 100644 index 440d9d0efc..0000000000 --- a/src/util/byte_range_http_requests.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - getByteRangeHeader, - responseArrayBuffer, -} from "#src/util/http_request.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { cancellableFetchSpecialOk } from "#src/util/special_protocol_request.js"; -import type { Uint64 } from "#src/util/uint64.js"; - -/** - * On Chromium, multiple concurrent byte range requests to the same URL are serialized unless the - * cache is disabled. Disabling the cache works around the problem. - * - * https://bugs.chromium.org/p/chromium/issues/detail?id=969828 - */ -const cacheMode = - navigator.userAgent.indexOf("Chrome") !== -1 ? "no-store" : "default"; - -export function fetchSpecialHttpByteRange( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - startOffset: Uint64 | number, - endOffset: Uint64 | number, - cancellationToken: CancellationToken, -): Promise { - return cancellableFetchSpecialOk( - credentialsProvider, - url, - { - headers: getByteRangeHeader(startOffset, endOffset), - cache: cacheMode, - }, - responseArrayBuffer, - cancellationToken, - ); -} diff --git a/src/util/cancellation.spec.ts b/src/util/cancellation.spec.ts deleted file mode 100644 index f1f9cfad50..0000000000 --- a/src/util/cancellation.spec.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { describe, expect, it } from "vitest"; - -import { - CANCELED, - CancellationTokenSource, - makeCancelablePromise, - MultipleConsumerCancellationTokenSource, - throwIfCanceled, - uncancelableToken, -} from "#src/util/cancellation.js"; - -describe("cancellation", () => { - describe("CancellationTokenSource", () => { - it("supports cancel", () => { - const source = new CancellationTokenSource(); - expect(source.isCanceled).toBe(false); - source.cancel(); - expect(source.isCanceled).toBe(true); - source.cancel(); - expect(source.isCanceled).toBe(true); - }); - - it("supports add", () => { - const source = new CancellationTokenSource(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - source.cancel(); - expect(log).toEqual([1]); - source.cancel(); - expect(log).toEqual([1]); - }); - - it("supports add after cancel", () => { - const source = new CancellationTokenSource(); - source.cancel(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - expect(log).toEqual([1]); - }); - - it("supports remove", () => { - const source = new CancellationTokenSource(); - const log: number[] = []; - const handler = () => { - log.push(1); - }; - source.add(handler); - source.remove(handler); - source.cancel(); - expect(log).toEqual([]); - }); - - it("supports throwIfCanceled", () => { - const source = new CancellationTokenSource(); - expect(() => throwIfCanceled(source)).not.toThrow(); - source.cancel(); - expect(() => throwIfCanceled(source)).toThrow(CANCELED); - }); - }); - - describe("uncancelableToken", () => { - it("supports isCanceled", () => { - expect(uncancelableToken.isCanceled).toBe(false); - }); - - it("supports add", () => { - uncancelableToken.add(() => {}); - }); - - it("supports remove", () => { - const handler = () => {}; - uncancelableToken.add(handler); - uncancelableToken.remove(handler); - }); - }); - - describe("MultipleConsumerCancellationTokenSource", () => { - it("supports cancellation from two consumers", () => { - const multiToken = new MultipleConsumerCancellationTokenSource(); - const token1 = new CancellationTokenSource(); - multiToken.addConsumer(token1); - const token2 = new CancellationTokenSource(); - multiToken.addConsumer(token2); - token1.cancel(); - expect(multiToken.isCanceled).toBe(false); - token2.cancel(); - expect(multiToken.isCanceled).toBe(true); - }); - - it("supports cancellation from three consumers", () => { - const multiToken = new MultipleConsumerCancellationTokenSource(); - const token1 = new CancellationTokenSource(); - multiToken.addConsumer(token1); - const token2 = new CancellationTokenSource(); - multiToken.addConsumer(token2); - token1.cancel(); - expect(multiToken.isCanceled).toBe(false); - const token3 = new CancellationTokenSource(); - multiToken.addConsumer(token3); - token2.cancel(); - expect(multiToken.isCanceled).toBe(false); - token3.cancel(); - expect(multiToken.isCanceled).toBe(true); - }); - }); - - describe("makeCancellablePromise", () => { - it("supports basic resolve behavior", async () => { - const promise = makeCancelablePromise( - uncancelableToken, - (resolve, _reject, _token) => { - resolve(3); - }, - ); - expect(await promise).toBe(3); - }); - it("supports basic reject behavior", async () => { - const promise = makeCancelablePromise( - uncancelableToken, - (_resolve, reject, _token) => { - reject(new Error("abc")); - }, - ); - expect(promise).rejects.toThrow("abc"); - }); - - it("unregisters the cancellation handler when the promise is fulfilled", () => { - const source = new CancellationTokenSource(); - const log: string[] = []; - makeCancelablePromise(source, (resolve, _reject, token) => { - token.add(() => { - log.push("cancel called"); - }); - resolve(1); - source.cancel(); - expect(log).toEqual([]); - }); - }); - - it("unregisters the cancellation handler when the promise is rejected", () => { - const source = new CancellationTokenSource(); - const log: string[] = []; - makeCancelablePromise(source, (_resolve, reject, token) => { - token.add(() => { - log.push("cancel called"); - }); - reject(1); - source.cancel(); - expect(log).toEqual([]); - }).catch(() => null); - }); - }); -}); diff --git a/src/util/cancellation.ts b/src/util/cancellation.ts deleted file mode 100644 index e4e031b660..0000000000 --- a/src/util/cancellation.ts +++ /dev/null @@ -1,206 +0,0 @@ -/** - * @license - * Copyright 2016 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file - * Cancellation token system with similarity to the cancellation_token in Microsoft's PPL. - */ - -/** - * Interface used by cancelable operations to monitor whether cancellation has occurred. - * - * Note that this interface does not provide any way to trigger cancellation; for that, - * CancellationTokenSource is used. - */ -export interface CancellationToken { - /** - * Indicates whether cancellation has occurred. - */ - readonly isCanceled: boolean; - - /** - * Add a cancellation handler function. The handler will be invoked synchronously if - * this.isCanceled === true. Otherwise, it will be invoked synchronously upon cancellation, - * unless it is removed prior to cancellation. - * - * The handler function must not throw any exceptions when called. - * - * @precondition The handler function must not already be registered. - * - * @param handler The handler function to add. - * - * @return A function that unregisters the handler. - */ - add(handler: () => void): () => void; - - /** - * Unregister a cancellation handler function. If this.isCanceled, or the specified handler - * function has not been registered, then this function has no effect. - */ - remove(handler: () => void): void; -} - -export class CancellationError extends Error { - name = "CancellationError"; - message = "CANCELED"; - toString() { - return "CANCELED"; - } -} - -/** - * Singleton instance of CancellationError thrown to indicate cancellation. - */ -export const CANCELED = new CancellationError(); - -/** - * Throws CANCELED if token.isCanceled === true. - */ -export function throwIfCanceled(token: CancellationToken) { - if (token.isCanceled === true) { - throw CANCELED; - } -} - -const noopFunction = () => {}; - -/** - * CancellationToken that cannot be canceled. This can be passed to operations that require a - * CancellationToken but will not need to be canceled. - */ -export const uncancelableToken: CancellationToken = { - isCanceled: false, - add: () => noopFunction, - remove: noopFunction, -}; - -/** - * Class that can be used to trigger cancellation. - */ -export class CancellationTokenSource implements CancellationToken { - /** - * Trigger cancellation. - * - * If this.isCanceled === false, then each registered cancellation handler is invoked - * synchronously. - */ - cancel() { - const { handlers } = this; - if (handlers !== null) { - this.handlers = null; - if (handlers !== undefined) { - for (const handler of handlers) { - handler(); - } - } - } - } - - get isCanceled() { - return this.handlers === null; - } - - private handlers: Set<() => void> | undefined | null; - - add(handler: () => void) { - let { handlers } = this; - if (handlers === null) { - handler(); - return noopFunction; - } - if (handlers === undefined) { - handlers = this.handlers = new Set<() => void>(); - } - handlers.add(handler); - return () => { - this.remove(handler); - }; - } - - remove(handler: () => void) { - const { handlers } = this; - if (handlers != null) { - handlers.delete(handler); - } - } -} - -/** - * Creates a CancellationToken corresponding to an asynchronous process with multiple consumers. It - * is cancelled only when the cancellation tokens corresponding to all of the consumers have been - * cancelled. - */ -export class MultipleConsumerCancellationTokenSource extends CancellationTokenSource { - private consumers = new Set(); - - addConsumer(cancellationToken: CancellationToken = uncancelableToken) { - const { consumers } = this; - if (consumers.has(cancellationToken) || cancellationToken.isCanceled) { - return; - } - consumers.add(cancellationToken); - cancellationToken.add(() => { - consumers.delete(cancellationToken); - if (consumers.size === 0) { - this.cancel(); - } - }); - } -} - -/** - * Creates a promise and a dependent cancellation token. - * - * The dependent cancellation token will be canceled if the specified `cancellationToken` is - * canceled while the promise is pending. - * - * @param cancellationToken The token that provides notification of cancellation. - * @param executor The executor passed the resolve and reject functions for the promise, as well as - * the dependent cancellation token. If cancellation occurs after either resolve or reject is - * called, then the dependent token is not cancelled. - * - * @returns A new Promise. - */ -export function makeCancelablePromise( - cancellationToken: CancellationToken, - executor: ( - resolve: (value: T | Promise) => void, - reject: (error: any) => void, - token: CancellationToken, - ) => void, -) { - return new Promise((resolve, reject) => { - if (cancellationToken === uncancelableToken) { - executor(resolve, reject, uncancelableToken); - return; - } - const scopedToken = new CancellationTokenSource(); - const unregister = cancellationToken.add(() => { - scopedToken.cancel(); - }); - executor( - (value) => { - unregister(); - resolve(value); - }, - (error) => { - unregister(); - reject(error); - }, - scopedToken, - ); - }); -} diff --git a/src/util/completion.ts b/src/util/completion.ts index a406a70b0d..5bbf406f09 100644 --- a/src/util/completion.ts +++ b/src/util/completion.ts @@ -26,6 +26,12 @@ export interface CompletionWithDescription extends Completion { export interface BasicCompletionResult { completions: C[]; + // Default completion to show. + // + // If not specified, the longest common prefix of all completions is the + // "default completion" to show inline as a hint and to append if the user + // presses TAB. This option overrides that. + defaultCompletion?: string; offset: number; } @@ -34,12 +40,12 @@ export const emptyCompletionResult = { completions: [], }; -export function applyCompletionOffset( +export function applyCompletionOffset( offset: number, completionResult: T, -) { - completionResult.offset += offset; - return completionResult; +): T { + if (completionResult === undefined) return completionResult; + return { ...completionResult, offset: completionResult.offset + offset }; } export function getPrefixMatches(prefix: string, options: Iterable) { @@ -137,3 +143,39 @@ export async function completeQueryStringParametersFromTable< }, ); } + +export async function concatCompletions( + url: string, + inputs: ( + | undefined + | BasicCompletionResult + | Promise | undefined> + )[], +): Promise> { + const resultSets: BasicCompletionResult[] = []; + let minOffset = Number.POSITIVE_INFINITY; + for (const result of await Promise.allSettled(inputs)) { + if (result.status === "rejected") continue; + const { value } = result; + if (value === undefined || value.completions.length === 0) continue; + resultSets.push(value); + minOffset = Math.min(minOffset, value.offset); + } + if (resultSets.length === 0) return emptyCompletionResult; + if (resultSets.length === 1) return resultSets[0]; + const completions: C[] = []; + let defaultCompletion: string | undefined; + for (const resultSet of resultSets) { + defaultCompletion = defaultCompletion ?? resultSet.defaultCompletion; + for (let completion of resultSet.completions) { + if (resultSet.offset !== minOffset) { + completion = { + ...completion, + value: url.slice(minOffset, resultSet.offset) + completion.value, + }; + } + completions.push(completion); + } + } + return { offset: minOffset, completions, defaultCompletion }; +} diff --git a/src/util/data_type.ts b/src/util/data_type.ts index 3e478f4e15..8ce7db97e2 100644 --- a/src/util/data_type.ts +++ b/src/util/data_type.ts @@ -80,16 +80,18 @@ export const DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT: Record< [DataType.FLOAT32]: 1, }; -export function makeDataTypeArrayView( +export function makeDataTypeArrayView( dataType: DataType, - buffer: ArrayBuffer, + buffer: TArrayBuffer, byteOffset = 0, byteLength: number = buffer.byteLength, -): ArrayBufferView { +): ArrayBufferView { const bytesPerElement = DATA_TYPE_BYTES[dataType]; const javascriptElementsPerArrayElement = DATA_TYPE_JAVASCRIPT_ELEMENTS_PER_ARRAY_ELEMENT[dataType]; - return new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType]( + return new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)( buffer, byteOffset, (byteLength / bytesPerElement) * javascriptElementsPerArrayElement, diff --git a/src/util/disposable.ts b/src/util/disposable.ts index dbcb95eea8..2ccedb327a 100644 --- a/src/util/disposable.ts +++ b/src/util/disposable.ts @@ -64,6 +64,9 @@ export class RefCounted implements Disposable { } this.refCountReachedZero(); } + [Symbol.dispose]() { + this.dispose(); + } protected refCountReachedZero() { this.disposed(); diff --git a/src/util/dom.ts b/src/util/dom.ts index 6a522923cd..b318034594 100644 --- a/src/util/dom.ts +++ b/src/util/dom.ts @@ -73,7 +73,7 @@ export function isInputTextTarget(target: EventTarget | null) { ) { return true; } - return false; + return target.closest(".neuroglancer-sticky-focus") !== null; } export function measureElementClone(element: HTMLElement) { diff --git a/src/util/drag_and_drop.ts b/src/util/drag_and_drop.ts index 5006c6fd4e..edf78c82cf 100644 --- a/src/util/drag_and_drop.ts +++ b/src/util/drag_and_drop.ts @@ -109,3 +109,39 @@ export function preventDrag(element: HTMLElement) { event.preventDefault(); }); } + +export function getDropEffectFromModifiers( + event: DragEvent, + defaultDropEffect: DropEffect, + moveAllowed: boolean, +): { dropEffect: DropEffect | "move" | "copy"; dropEffectMessage: string } { + let dropEffect: DropEffect | "move" | "copy"; + if (event.shiftKey) { + dropEffect = "copy"; + } else if (event.ctrlKey && moveAllowed) { + dropEffect = "move"; + } else { + dropEffect = defaultDropEffect; + } + let message = ""; + const addMessage = (msg: string) => { + if (message !== "") { + message += ", "; + } + message += msg; + }; + if (defaultDropEffect !== "none" && dropEffect !== defaultDropEffect) { + if (event.shiftKey) { + addMessage(`release SHIFT to ${defaultDropEffect}`); + } else { + addMessage(`release CONTROL to ${defaultDropEffect}`); + } + } + if (dropEffect !== "copy") { + addMessage("hold SHIFT to copy"); + } + if (dropEffect !== "move" && moveAllowed && defaultDropEffect !== "move") { + addMessage("hold CONTROL to move"); + } + return { dropEffect, dropEffectMessage: message }; +} diff --git a/src/util/dropdown.ts b/src/util/dropdown.ts index c79ca8a473..662b5312bb 100644 --- a/src/util/dropdown.ts +++ b/src/util/dropdown.ts @@ -62,6 +62,7 @@ export function positionDropdown( const distanceToBottom = viewportHeight - rect.bottom - bottomMargin; dropdownElement.style.left = `${rect.left}px`; dropdownElement.style.width = `${rect.width}px`; + dropdownElement.style.maxWidth = `${rect.width}px`; if (distanceToTop > distanceToBottom * 3) { dropdownElement.style.top = ""; dropdownElement.style.bottom = `${viewportHeight - rect.top}px`; @@ -77,3 +78,35 @@ export function positionDropdown( } } } + +export function positionRelativeDropdown( + dropdown: HTMLElement, + parent: HTMLElement, +) { + const rect = parent.getBoundingClientRect(); + const topMargin = 6; + const bottomMargin = 6; + + const { clientHeight: viewportWidth, clientWidth: viewportHeight } = + dropdown.ownerDocument!.documentElement!; + const distanceToTop = rect.top - topMargin; + const distanceToBottom = viewportHeight - rect.bottom - bottomMargin; + + if (rect.left < viewportWidth - rect.right) { + dropdown.style.left = "0px"; + dropdown.style.right = ""; + } else { + dropdown.style.right = "0px"; + dropdown.style.left = ""; + } + dropdown.style.maxWidth = `${rect.width}px`; + if (distanceToTop > distanceToBottom * 3) { + dropdown.style.top = ""; + dropdown.style.bottom = `${viewportHeight - rect.top}px`; + dropdown.style.maxHeight = distanceToTop + "px"; + } else { + dropdown.style.top = `${rect.bottom}px`; + dropdown.style.bottom = ""; + dropdown.style.maxHeight = distanceToBottom + "px"; + } +} diff --git a/src/util/error.ts b/src/util/error.ts index 3dd27e9554..64801ab29a 100644 --- a/src/util/error.ts +++ b/src/util/error.ts @@ -28,3 +28,19 @@ export function valueOrThrow(x: ValueOrError): T { if (x.error !== undefined) throw new Error(x.error); return x; } + +export function formatErrorMessage(error: unknown): string { + if (typeof error === "string") return error; + if (error instanceof Error) { + const { message, cause } = error; + if (cause !== undefined) { + return `${message}: ${formatErrorMessage(cause)}`; + } + return message; + } + try { + return "" + error; + } catch { + return "Unknown error"; + } +} diff --git a/src/util/float32array_builder.ts b/src/util/float32array_builder.ts index 271d5a6160..513e05e284 100644 --- a/src/util/float32array_builder.ts +++ b/src/util/float32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Float32ArrayBuilder { length = 0; - data: Float32Array; + data: Float32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Float32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Float32ArrayBuilder { get view() { const { data } = this; - return new Float32Array(data.buffer, data.byteOffset, this.length); + return new Float32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/float64array_builder.ts b/src/util/float64array_builder.ts index 960c22afad..32ca2a5632 100644 --- a/src/util/float64array_builder.ts +++ b/src/util/float64array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Float64ArrayBuilder { length = 0; - data: Float64Array; + data: Float64Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Float64Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Float64ArrayBuilder { get view() { const { data } = this; - return new Float64Array(data.buffer, data.byteOffset, this.length); + return new Float64Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/gcs_bucket_listing.ts b/src/util/gcs_bucket_listing.ts deleted file mode 100644 index 54de284571..0000000000 --- a/src/util/gcs_bucket_listing.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { BasicCompletionResult } from "#src/util/completion.js"; -import { responseJson } from "#src/util/http_request.js"; -import { - parseArray, - verifyObject, - verifyObjectProperty, - verifyOptionalObjectProperty, - verifyString, - verifyStringArray, -} from "#src/util/json.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; - -export async function getGcsBucketListing( - credentialsProvider: SpecialProtocolCredentialsProvider, - bucket: string, - prefix: string, - delimiter: string, - cancellationToken: CancellationToken, -): Promise { - // Include origin as `neuroglancerOrigin` query string parameter. See comment in - // `special_protocol_request.ts` for details. - const response = await fetchWithOAuth2Credentials( - credentialsProvider, - `https://www.googleapis.com/storage/v1/b/${bucket}/o?` + - `delimiter=${encodeURIComponent(delimiter)}&prefix=${encodeURIComponent( - prefix, - )}&` + - `neuroglancerOrigin=${encodeURIComponent(location.origin)}`, - {}, - responseJson, - cancellationToken, - ); - verifyObject(response); - const prefixes = verifyOptionalObjectProperty( - response, - "prefixes", - verifyStringArray, - [], - ); - const items = verifyOptionalObjectProperty( - response, - "items", - (items) => - parseArray(items, (item) => { - verifyObject(item); - return verifyObjectProperty(item, "name", verifyString); - }), - [], - ).filter((name) => !name.endsWith("_$folder$")); - return [...prefixes, ...items]; -} - -export async function getGcsPathCompletions( - credentialsProvider: SpecialProtocolCredentialsProvider, - enteredBucketUrl: string, - bucket: string, - path: string, - cancellationToken: CancellationToken, -): Promise { - const prefix = path; - if (!prefix.startsWith("/")) throw null; - const paths = await getGcsBucketListing( - credentialsProvider, - bucket, - path.substring(1), - "/", - cancellationToken, - ); - const offset = path.lastIndexOf("/"); - return { - offset: offset + enteredBucketUrl.length + 1, - completions: paths.map((x) => ({ value: x.substring(offset) })), - }; -} diff --git a/src/util/google_oauth2.ts b/src/util/google_oauth2.ts index 8aee6576d8..50e8f6241f 100644 --- a/src/util/google_oauth2.ts +++ b/src/util/google_oauth2.ts @@ -18,20 +18,18 @@ import { CredentialsProvider, makeCredentialsGetter, } from "#src/credentials_provider/index.js"; -import { StatusMessage } from "#src/status.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; import { - CANCELED, - CancellationTokenSource, - uncancelableToken, -} from "#src/util/cancellation.js"; -import { RefCounted } from "#src/util/disposable.js"; + getCredentialsWithStatus, + monitorAuthPopupWindow, +} from "#src/credentials_provider/interactive_credentials_provider.js"; +import { raceWithAbort } from "#src/util/abort.js"; import { removeFromParent } from "#src/util/dom.js"; import { verifyObject, verifyObjectProperty, verifyString, } from "#src/util/json.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; import { getRandomHexString } from "#src/util/random.js"; export const EMAIL_SCOPE = "email"; @@ -63,62 +61,57 @@ function extractEmailFromIdToken(idToken: string): string { } } -async function waitForAuthResponseMessage( +// Note: `signal` is guaranteed to be aborted once the operation completes. +function waitForAuthResponseMessage( source: Window, state: string, - cancellationToken: CancellationToken, + signal: AbortSignal, ): Promise { - const context = new RefCounted(); - try { - return await new Promise((resolve, reject) => { - context.registerDisposer(cancellationToken.add(() => reject(CANCELED))); - context.registerEventListener( - window, - "message", - (event: MessageEvent) => { - if (event.origin !== location.origin) { - return; - } + return new Promise((resolve, reject) => { + window.addEventListener( + "message", + (event: MessageEvent) => { + if (event.origin !== location.origin) { + return; + } - if (event.source !== source) return; + if (event.source !== source) return; - try { - const obj = verifyObject(event.data); - const receivedState = verifyObjectProperty( + try { + const obj = verifyObject(event.data); + const receivedState = verifyObjectProperty( + obj, + "state", + verifyString, + ); + if (receivedState !== state) { + throw new Error("invalid state"); + } + const idToken = verifyObjectProperty(obj, "id_token", verifyString); + const token: OAuth2Token = { + accessToken: verifyObjectProperty( obj, - "state", + "access_token", verifyString, - ); - if (receivedState !== state) { - throw new Error("invalid state"); - } - const idToken = verifyObjectProperty(obj, "id_token", verifyString); - const token: OAuth2Token = { - accessToken: verifyObjectProperty( - obj, - "access_token", - verifyString, - ), - tokenType: verifyObjectProperty(obj, "token_type", verifyString), - expiresIn: verifyObjectProperty(obj, "expires_in", verifyString), - scope: verifyObjectProperty(obj, "scope", verifyString), - email: extractEmailFromIdToken(idToken), - }; - resolve(token); - } catch (parseError) { - reject( - new Error( - `Received unexpected authentication response: ${parseError.message}`, - ), - ); - console.error("Response received: ", event.data); - } - }, - ); - }); - } finally { - context.dispose(); - } + ), + tokenType: verifyObjectProperty(obj, "token_type", verifyString), + expiresIn: verifyObjectProperty(obj, "expires_in", verifyString), + scope: verifyObjectProperty(obj, "scope", verifyString), + email: extractEmailFromIdToken(idToken), + }; + resolve(token); + } catch (parseError) { + reject( + new Error( + `Received unexpected authentication response: ${parseError.message}`, + ), + ); + console.error("Response received: ", event.data); + } + }, + { signal: signal }, + ); + }); } function makeAuthRequestUrl(options: { @@ -129,6 +122,7 @@ function makeAuthRequestUrl(options: { state?: string; loginHint?: string; authUser?: number; + includeGrantedScopes?: boolean; immediate?: boolean; }) { let url = `${AUTH_SERVER}?client_id=${encodeURIComponent(options.clientId)}`; @@ -141,7 +135,9 @@ function makeAuthRequestUrl(options: { responseType = "token%20id_token"; } url += `&response_type=${responseType}`; - url += "&include_granted_scopes=true"; + if (options.includeGrantedScopes === true) { + url += "&include_granted_scopes=true"; + } url += `&scope=${encodeURIComponent(scopes.join(" "))}`; if (options.state) { url += `&state=${options.state}`; @@ -161,6 +157,30 @@ function makeAuthRequestUrl(options: { return url; } +function createAuthIframe( + url: string, + abortController: AbortController, +): Window { + const iframe = document.createElement("iframe"); + iframe.src = url; + iframe.style.display = "none"; + iframe.addEventListener( + "load", + () => { + if (iframe.contentDocument == null) { + // Error received + abortController.abort(new Error("Immediate authentication failed")); + } + }, + { signal: abortController.signal }, + ); + document.body.appendChild(iframe); + abortController.signal.addEventListener("abort", () => { + removeFromParent(iframe); + }); + return iframe.contentWindow!; +} + /** * Obtain a Google OAuth2 authentication token. * @return A Promise that resolves to an authentication token. @@ -174,7 +194,7 @@ export async function authenticateGoogleOAuth2( immediate?: boolean; authUser?: number; }, - cancellationToken = uncancelableToken, + signal: AbortSignal, ) { const state = getRandomHexString(); const nonce = getRandomHexString(); @@ -188,52 +208,26 @@ export async function authenticateGoogleOAuth2( immediate: options.immediate, authUser: options.authUser, }); - let source: Window; - let cleanup: (() => void) | undefined; - const extraPromises: Array> = []; - if (options.immediate) { - // For immediate mode auth, we can wait until the relay is ready, since we aren't opening a new - // window. - const iframe = document.createElement("iframe"); - iframe.src = url; - iframe.style.display = "none"; - extraPromises.push( - new Promise((_resolve, reject) => { - iframe.addEventListener("load", () => { - console.log("iframe loaded", iframe.contentDocument); - if (iframe.contentDocument == null) { - // Error received - reject(new Error("Immediate authentication failed")); - } - }); - }), - ); - document.body.appendChild(iframe); - source = iframe.contentWindow!; - cleanup = () => { - removeFromParent(iframe); - }; - } else { - const newWindow = open(url); - source = newWindow!; - if (newWindow !== null) { - cleanup = () => { - try { - newWindow.close(); - } catch { - // Ignore error closing window. - } - }; - } - } - + const abortController = new AbortController(); + signal = AbortSignal.any([abortController.signal, signal]); try { - return await Promise.race([ - ...extraPromises, - waitForAuthResponseMessage(source, state, cancellationToken), - ]); + let source: Window; + if (options.immediate) { + source = createAuthIframe(url, abortController); + } else { + const newWindow = open(url); + if (newWindow === null) { + throw new Error("Failed to create authentication popup window"); + } + monitorAuthPopupWindow(newWindow, abortController); + source = newWindow!; + } + return await raceWithAbort( + waitForAuthResponseMessage(source, state, abortController.signal), + signal, + ); } finally { - cleanup?.(); + abortController.abort(); } } @@ -244,76 +238,26 @@ export class GoogleOAuth2CredentialsProvider extends CredentialsProvider { - const { options } = this; - const status = new StatusMessage(/*delay=*/ true); - let cancellationSource: CancellationTokenSource | undefined; - return new Promise((resolve, reject) => { - const dispose = () => { - cancellationSource = undefined; - status.dispose(); - }; - cancellationToken.add(() => { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - cancellationSource = undefined; - status.dispose(); - reject(CANCELED); - } - }); - function writeLoginStatus( - msg = `${options.description} authorization required.`, - linkMessage = "Request authorization.", - ) { - status.setText(msg + " "); - const button = document.createElement("button"); - button.textContent = linkMessage; - status.element.appendChild(button); - button.addEventListener("click", () => { - login(/*immediate=*/ false); - }); - status.setVisible(true); - } - function login(immediate: boolean) { - if (cancellationSource !== undefined) { - cancellationSource.cancel(); - } - cancellationSource = new CancellationTokenSource(); - writeLoginStatus( - `Waiting for ${options.description} authorization...`, - "Retry", - ); - authenticateGoogleOAuth2( - { - clientId: options.clientId, - scopes: options.scopes, - immediate: immediate, - authUser: 0, - }, - cancellationSource, - ).then( - (token) => { - if (cancellationSource !== undefined) { - dispose(); - resolve(token); - } - }, - (reason) => { - if (cancellationSource !== undefined) { - cancellationSource = undefined; - if (immediate) { - writeLoginStatus(); - } else { - writeLoginStatus( - `${options.description} authorization failed: ${reason}.`, - "Retry", - ); - } - } - }, - ); - } - login(/*immediate=*/ true); + get = makeCredentialsGetter(async (options) => { + using _span = new ProgressSpan(options.progressListener, { + message: `Requesting ${this.options.description} OAuth2 access token`, }); + return await getCredentialsWithStatus( + { + description: this.options.description, + supportsImmediate: true, + get: (signal, immediate) => + authenticateGoogleOAuth2( + { + clientId: this.options.clientId, + scopes: this.options.scopes, + immediate: immediate, + authUser: 0, + }, + signal, + ), + }, + options.signal, + ); }); } diff --git a/src/util/gzip.ts b/src/util/gzip.ts index 118e037032..4b412bf5ca 100644 --- a/src/util/gzip.ts +++ b/src/util/gzip.ts @@ -15,18 +15,41 @@ */ /** - * Detects gzip format based on the 2 magic bytes at the start. + * Detects gzip format based on the 3 magic bytes at the start. */ export function isGzipFormat(data: ArrayBufferView) { const view = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); - return view.length > 2 && view[0] === 0x1f && view[1] === 0x8b; + return ( + view.length >= 3 && view[0] === 0x1f && view[1] === 0x8b && view[2] === 0x08 + ); } -export async function decodeGzip(data: ArrayBuffer | ArrayBufferView) { - const decompressedStream = new Response(data).body!.pipeThrough( - new DecompressionStream("gzip"), - ); - return await new Response(decompressedStream).arrayBuffer(); +export async function decodeGzip( + data: ArrayBuffer | ArrayBufferView | Response, + format: CompressionFormat, + signal?: AbortSignal, +) { + try { + const decompressedStream = decodeGzipStream( + data instanceof Response ? data : new Response(data), + format, + signal, + ); + return await new Response(decompressedStream).arrayBuffer(); + } catch { + signal?.throwIfAborted(); + throw new Error(`Failed to decode ${format}`); + } +} + +export function decodeGzipStream( + response: Response, + format: CompressionFormat, + signal?: AbortSignal, +): ReadableStream { + return response.body!.pipeThrough(new DecompressionStream(format), { + signal: signal, + }); } /** @@ -40,7 +63,7 @@ export async function maybeDecompressGzip(data: ArrayBuffer | ArrayBufferView) { byteView = new Uint8Array(data.buffer, data.byteOffset, data.byteLength); } if (isGzipFormat(byteView)) { - return new Uint8Array(await decodeGzip(byteView)); + return new Uint8Array(await decodeGzip(byteView, "gzip")); } return byteView; } diff --git a/src/util/hash.ts b/src/util/hash.ts index 70ed1de192..964c6283af 100644 --- a/src/util/hash.ts +++ b/src/util/hash.ts @@ -143,3 +143,56 @@ export function murmurHash3_x86_128Hash64Bits( out.high = h2; return out; } + +export function murmurHash3_x86_128Hash64Bits_Bigint( + seed: number, + input: bigint, +): bigint { + let h1 = seed; + let h2 = seed; + let h3 = seed; + let h4 = seed; + const c1 = 0x239b961b; + const c2 = 0xab0e9789; + const c3 = 0x38b34ae5; + // const c4 = 0xa1e38b93; + + let k2 = Math.imul(Number(input >> BigInt(32)), c2); + k2 = rotl32(k2, 16); + k2 = Math.imul(k2, c3); + h2 ^= k2; + + let k1 = Math.imul(Number(input & BigInt(0xffffffff)), c1); + k1 = rotl32(k1, 15); + k1 = Math.imul(k1, c2); + h1 ^= k1; + + const len = 8; + + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 = (h1 + h2) >>> 0; + h1 = (h1 + h3) >>> 0; + h1 = (h1 + h4) >>> 0; + h2 = (h2 + h1) >>> 0; + h3 = (h3 + h1) >>> 0; + h4 = (h4 + h1) >>> 0; + + h1 = murmurHash3_x86_128Mix(h1); + h2 = murmurHash3_x86_128Mix(h2); + h3 = murmurHash3_x86_128Mix(h3); + h4 = murmurHash3_x86_128Mix(h4); + + h1 = (h1 + h2) >>> 0; + h1 = (h1 + h3) >>> 0; + h1 = (h1 + h4) >>> 0; + h2 = (h2 + h1) >>> 0; + + // h3 = (h3 + h1) >>> 0; + // h4 = (h4 + h1) >>> 0; + + return BigInt(h1) | (BigInt(h2) << BigInt(32)); +} diff --git a/src/util/http_path_completion.ts b/src/util/http_path_completion.ts deleted file mode 100644 index 93743b7597..0000000000 --- a/src/util/http_path_completion.ts +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { CredentialsManager } from "#src/credentials_provider/index.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { - BasicCompletionResult, - Completion, - CompletionWithDescription, -} from "#src/util/completion.js"; -import { getPrefixMatchesWithDescriptions } from "#src/util/completion.js"; -import { getGcsPathCompletions } from "#src/util/gcs_bucket_listing.js"; -import { parseUrl } from "#src/util/http_request.js"; -import { getS3PathCompletions } from "#src/util/s3.js"; -import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; -import { - cancellableFetchSpecialOk, - parseSpecialUrl, -} from "#src/util/special_protocol_request.js"; - -/** - * Obtains a directory listing from a server that supports HTML directory listings. - */ -export async function getHtmlDirectoryListing( - url: string, - cancellationToken: CancellationToken, - credentialsProvider?: SpecialProtocolCredentialsProvider, -): Promise { - const { text, contentType } = await cancellableFetchSpecialOk( - credentialsProvider, - url, - /*init=*/ { headers: { accept: "text/html" } }, - async (x) => ({ - text: await x.text(), - contentType: x.headers.get("content-type"), - }), - cancellationToken, - ); - if (contentType === null || /\btext\/html\b/i.exec(contentType) === null) { - return []; - } - const doc = new DOMParser().parseFromString(text, "text/html"); - const nodes = doc.evaluate( - "//a/@href", - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - const results: string[] = []; - for (let i = 0, n = nodes.snapshotLength; i < n; ++i) { - const node = nodes.snapshotItem(i)!; - const href = node.textContent; - if (href) { - results.push(new URL(href, url).toString()); - } - } - return results; -} - -export async function getHtmlPathCompletions( - url: string, - cancellationToken: CancellationToken, - credentialsProvider?: SpecialProtocolCredentialsProvider, -): Promise { - console.log("getHtmlPathCompletions"); - const m = url.match(/^([a-z]+:\/\/.*\/)([^/?#]*)$/); - if (m === null) throw null; - const entries = await getHtmlDirectoryListing( - m[1], - cancellationToken, - credentialsProvider, - ); - const offset = m[1].length; - const matches: Completion[] = []; - for (const entry of entries) { - if (!entry.startsWith(url)) continue; - matches.push({ value: entry.substring(offset) }); - } - return { - offset, - completions: matches, - }; -} - -const specialProtocolEmptyCompletions: CompletionWithDescription[] = [ - { value: "gs://", description: "Google Cloud Storage (JSON API)" }, - { value: "gs+xml://", description: "Google Cloud Storage (XML API)" }, - { - value: "gs+ngauth+http://", - description: "Google Cloud Storage (JSON API) authenticated via ngauth", - }, - { - value: "gs+ngauth+https://", - description: "Google Cloud Storage (JSON API) authenticated via ngauth", - }, - { - value: "gs+xml+ngauth+http://", - description: "Google Cloud Storage (XML API) authenticated via ngauth", - }, - { - value: "gs+xml+ngauth+https://", - description: "Google Cloud Storage (XML API) authenticated via ngauth", - }, - { value: "s3://", description: "Amazon Simple Storage Service (S3)" }, - { value: "https://" }, - { value: "http://" }, -]; - -export async function completeHttpPath( - credentialsManager: CredentialsManager, - url: string, - cancellationToken: CancellationToken, -): Promise> { - if (!url.includes("://")) { - return { - offset: 0, - completions: getPrefixMatchesWithDescriptions( - url, - specialProtocolEmptyCompletions, - (x) => x.value, - (x) => x.description, - ), - }; - } - const { url: parsedUrl, credentialsProvider } = parseSpecialUrl( - url, - credentialsManager, - ); - const offset = url.length - parsedUrl.length; - let result; - try { - result = parseUrl(parsedUrl); - } catch { - throw null; - } - const { protocol, host, path } = result; - const completions = await (async () => { - if (protocol === "gs+xml" && path.length > 0) { - return await getS3CompatiblePathCompletions( - credentialsProvider, - `${protocol}://${host}`, - `https://storage.googleapis.com/${host}`, - path, - cancellationToken, - ); - } - if (protocol === "gs" && path.length > 0) { - return await getGcsPathCompletions( - credentialsProvider, - `${protocol}://${host}`, - host, - path, - cancellationToken, - ); - } - if (protocol === "s3" && path.length > 0) { - return await getS3PathCompletions(host, path, cancellationToken); - } - const s3Match = parsedUrl.match( - /^((?:http|https):\/\/(?:storage\.googleapis\.com\/[^/]+|[^/]+\.storage\.googleapis\.com|[^/]+\.s3(?:[^./]+)?\.amazonaws.com))(\/.*)$/, - ); - if (s3Match !== null) { - return await getS3CompatiblePathCompletions( - credentialsProvider, - s3Match[1], - s3Match[1], - s3Match[2], - cancellationToken, - ); - } - if ((protocol === "http" || protocol === "https") && path.length > 0) { - return await getHtmlPathCompletions( - parsedUrl, - cancellationToken, - credentialsProvider, - ); - } - throw null; - })(); - return { - offset: offset + completions.offset, - completions: completions.completions, - }; -} diff --git a/src/util/http_request.ts b/src/util/http_request.ts index dbfef9c38c..293cc68119 100644 --- a/src/util/http_request.ts +++ b/src/util/http_request.ts @@ -14,9 +14,7 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CANCELED, uncancelableToken } from "#src/util/cancellation.js"; -import { Uint64 } from "#src/util/uint64.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; export class HttpError extends Error { url: string; @@ -29,6 +27,7 @@ export class HttpError extends Error { status: number, statusText: string, response?: Response, + options?: { cause: any }, ) { let message = `Fetching ${JSON.stringify( url, @@ -37,7 +36,7 @@ export class HttpError extends Error { message += `: ${statusText}`; } message += "."; - super(message); + super(message, options); this.name = "HttpError"; this.message = message; this.url = url; @@ -65,7 +64,9 @@ export class HttpError extends Error { } else { url = input.url; } - return new HttpError(url, 0, "Network or CORS error"); + return new HttpError(url, 0, "Network or CORS error", undefined, { + cause: error, + }); } return error; } @@ -99,12 +100,10 @@ export function pickDelay(attemptNumber: number): number { */ export async function fetchOk( input: RequestInfo, - init?: RequestInit, + init?: RequestInitWithProgress, ): Promise { for (let requestAttempt = 0; ; ) { - if (init?.signal?.aborted) { - throw CANCELED; - } + init?.signal?.throwIfAborted(); let response: Response; try { response = await fetch(input, init); @@ -130,78 +129,14 @@ export async function fetchOk( } } -export function responseArrayBuffer(response: Response): Promise { - return response.arrayBuffer(); -} - -export function responseJson(response: Response): Promise { - return response.json(); +export interface RequestInitWithProgress extends RequestInit { + progressListener?: ProgressListener; } -export type ResponseTransform = (response: Response) => Promise; - -/** - * Issues a `fetch` request in the same way as `fetchOk`, and returns the result of the promise - * returned by `transformResponse`. - * - * Additionally, the request may be cancelled through `cancellationToken`. - * - * The `transformResponse` function should not do anything with the `Response` object after its - * result becomes ready; otherwise, cancellation may not work as expected. - */ -export async function cancellableFetchOk( +export type FetchOk = ( input: RequestInfo, - init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - if (cancellationToken === uncancelableToken) { - const response = await fetchOk(input, init); - return await transformResponse(response); - } - const abortController = new AbortController(); - const unregisterCancellation = cancellationToken.add(() => - abortController.abort(), - ); - try { - const response = await fetchOk(input, { - ...init, - signal: abortController.signal, - }); - return await transformResponse(response); - } finally { - unregisterCancellation(); - } -} - -const tempUint64 = new Uint64(); - -export function getByteRangeHeader( - startOffset: Uint64 | number, - endOffset: Uint64 | number, -) { - let endOffsetStr: string; - if (typeof endOffset === "number") { - endOffsetStr = `${endOffset - 1}`; - } else { - Uint64.decrement(tempUint64, endOffset); - endOffsetStr = tempUint64.toString(); - } - return { Range: `bytes=${startOffset}-${endOffsetStr}` }; -} - -export function parseUrl(url: string): { - protocol: string; - host: string; - path: string; -} { - const urlProtocolPattern = /^([^:/]+):\/\/([^/]+)((?:\/.*)?)$/; - const match = url.match(urlProtocolPattern); - if (match === null) { - throw new Error(`Invalid URL: ${JSON.stringify(url)}`); - } - return { protocol: match[1], host: match[2], path: match[3] }; -} + init?: RequestInitWithProgress, +) => Promise; export function isNotFoundError(e: any) { if (!(e instanceof HttpError)) return false; diff --git a/src/util/int16array_builder.ts b/src/util/int16array_builder.ts index 80e86a3504..80fb1c282c 100644 --- a/src/util/int16array_builder.ts +++ b/src/util/int16array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int16ArrayBuilder { length = 0; - data: Int16Array; + data: Int16Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int16Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int16ArrayBuilder { get view() { const { data } = this; - return new Int16Array(data.buffer, data.byteOffset, this.length); + return new Int16Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/int32array_builder.ts b/src/util/int32array_builder.ts index 035c022596..31778b442f 100644 --- a/src/util/int32array_builder.ts +++ b/src/util/int32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int32ArrayBuilder { length = 0; - data: Int32Array; + data: Int32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int32ArrayBuilder { get view() { const { data } = this; - return new Int32Array(data.buffer, data.byteOffset, this.length); + return new Int32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/int8array_builder.ts b/src/util/int8array_builder.ts index 923b97ba1d..5ff5d37d28 100644 --- a/src/util/int8array_builder.ts +++ b/src/util/int8array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Int8ArrayBuilder { length = 0; - data: Int8Array; + data: Int8Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Int8Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Int8ArrayBuilder { get view() { const { data } = this; - return new Int8Array(data.buffer, data.byteOffset, this.length); + return new Int8Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/leb128.spec.ts b/src/util/leb128.spec.ts new file mode 100644 index 0000000000..d7e0f3cccd --- /dev/null +++ b/src/util/leb128.spec.ts @@ -0,0 +1,46 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from "vitest"; +import { decodeLeb128, decodeLeb128Bigint } from "#src/util/leb128.js"; + +function doDecode(array: Uint8Array) { + const dataView = new DataView( + array.buffer, + array.byteOffset, + array.byteLength, + ); + return decodeLeb128(dataView, 0).value; +} + +function doDecodeBigint(array: Uint8Array) { + const dataView = new DataView( + array.buffer, + array.byteOffset, + array.byteLength, + ); + return decodeLeb128Bigint(dataView, 0).value; +} + +test("simple", () => { + expect(doDecode(Uint8Array.of(0))).toEqual(0); + expect(doDecode(Uint8Array.of(127))).toEqual(127); + expect( + doDecodeBigint( + Uint8Array.of(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1), + ), + ).toEqual(0xffffffffffffffffn); +}); diff --git a/src/util/leb128.ts b/src/util/leb128.ts new file mode 100644 index 0000000000..87c70eb0f7 --- /dev/null +++ b/src/util/leb128.ts @@ -0,0 +1,52 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function decodeLeb128( + array: DataView, + offset: number, +): { offset: number; value: number } { + let result = 0; + let shift = 0; + for (let i = offset, length = array.byteLength; i < length; ++i) { + const byte = array.getUint8(i); + result += (byte & 0x7f) << shift; + if ((byte & 0x80) === 0) { + if (result > Number.MAX_SAFE_INTEGER) { + throw new Error(`Value exceeded ${Number.MAX_SAFE_INTEGER}`); + } + return { offset: i + 1, value: result }; + } + shift += 7; + } + throw new Error("Unexpected EOF"); +} + +export function decodeLeb128Bigint( + array: DataView, + offset: number, +): { offset: number; value: bigint } { + let result = 0n; + let shift = 0n; + for (let i = offset, length = array.byteLength; i < length; ++i) { + const byte = array.getUint8(i); + result |= BigInt(byte & 0x7f) << BigInt(shift); + if ((byte & 0x80) === 0) { + return { offset: i + 1, value: result }; + } + shift += 7n; + } + throw new Error("Unexpected EOF"); +} diff --git a/src/util/linked_list.0.ts b/src/util/linked_list.0.ts index 2de7c5595d..0561c54970 100644 --- a/src/util/linked_list.0.ts +++ b/src/util/linked_list.0.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/linked_list.template.ts. +// DO NOT EDIT. Generated from templates/util/linked_list.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/util/linked_list.1.ts b/src/util/linked_list.1.ts index e7163da435..6a6ce2416b 100644 --- a/src/util/linked_list.1.ts +++ b/src/util/linked_list.1.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/linked_list.template.ts. +// DO NOT EDIT. Generated from templates/util/linked_list.template.ts. /** * @license * Copyright 2016 Google Inc. diff --git a/src/util/memoize.spec.ts b/src/util/memoize.spec.ts new file mode 100644 index 0000000000..34b3195e15 --- /dev/null +++ b/src/util/memoize.spec.ts @@ -0,0 +1,178 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, test, expect, vi } from "vitest"; +import { raceWithAbort } from "#src/util/abort.js"; +import { asyncMemoize, asyncMemoizeWithProgress } from "#src/util/memoize.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; + +function asyncMemoizeTests(asyncMemoizeImpl: typeof asyncMemoize) { + test("should call the getter only once even if called multiple times", async () => { + const getter = vi.fn().mockResolvedValue("result"); + const memoizedGetter = asyncMemoizeImpl(getter); + + const promise1 = memoizedGetter({}); + const promise2 = memoizedGetter({}); + + await Promise.all([promise1, promise2]); + + expect(getter).toHaveBeenCalledTimes(1); + }); + + test("should handle getter rejections", async () => { + const getter = vi.fn().mockRejectedValue(new Error("error")); + const memoizedGetter = asyncMemoizeImpl(getter); + + const promise1 = memoizedGetter({}); + const promise2 = memoizedGetter({}); + + await expect(promise1).rejects.toThrow("error"); + await expect(promise2).rejects.toThrow("error"); + expect(getter).toHaveBeenCalledTimes(1); + }); + + test("should abort the getter if the signal is aborted before the call", async () => { + const getter = vi.fn(); + const memoizedGetter = asyncMemoizeImpl(getter); + const controller = new AbortController(); + controller.abort("reason"); + + await expect(memoizedGetter({ signal: controller.signal })).rejects.toThrow( + "reason", + ); + expect(getter).not.toHaveBeenCalled(); + }); + + test("should abort the getter if the signal is aborted during the call", async () => { + const neverResolved = new Promise(() => {}); + const getter = vi.fn(async ({ signal }) => + raceWithAbort(neverResolved, signal), + ); + const memoizedGetter = asyncMemoizeImpl(getter); + + const controller = new AbortController(); + const promise = memoizedGetter({ signal: controller.signal }); + controller.abort("reason"); + await expect(promise).rejects.toBe("reason"); + expect(getter).toHaveBeenCalledTimes(1); + }); + + test("should call getter again if first call aborted", async () => { + const { promise: getterPromise, resolve: getterResolve } = + Promise.withResolvers(); + const getter = vi.fn(async ({ signal }) => + raceWithAbort(getterPromise, signal), + ); + const memoizedGetter = asyncMemoizeImpl(getter); + + const controller1 = new AbortController(); + const promise1 = memoizedGetter({ signal: controller1.signal }); + controller1.abort("reason"); + await expect(promise1).rejects.toBe("reason"); + + const controller2 = new AbortController(); + const promise2 = memoizedGetter({ signal: controller2.signal }); + getterResolve("some result"); + await expect(promise2).resolves.toBe("some result"); + + expect(getter).toHaveBeenCalledTimes(2); + + const promise3 = memoizedGetter({}); + await expect(promise3).resolves.toBe("some result"); // should reuse previous successful result + + expect(getter).toHaveBeenCalledTimes(2); // still 2 + }); + + test("getter receives abort signal on abort", async () => { + const abortPromise = Promise.withResolvers(); + const memoizedGetter = asyncMemoizeImpl(async ({ signal }) => { + signal.addEventListener("abort", () => + abortPromise.reject(signal.reason), + ); + }); + + const controller = new AbortController(); + const promise = memoizedGetter({ signal: controller.signal }); + controller.abort("abort reason"); + await expect(promise).rejects.toThrow("abort reason"); + + await expect(abortPromise.promise).rejects.toThrow(); + }); +} + +describe("asyncMemoize", () => { + asyncMemoizeTests(asyncMemoize); +}); + +describe("asyncMemoizeWithProgress", () => { + asyncMemoizeTests(asyncMemoizeWithProgress); + test("should report progress to the listener", async () => { + const { promise: getterPromise, resolve: getterResolve } = + Promise.withResolvers(); + const getter = vi.fn( + async (options: { progressListener: ProgressListener }) => { + using _span1 = new ProgressSpan(options.progressListener, { + message: "span1", + }); + return await getterPromise; + }, + ); + + const memoizedGetter = asyncMemoizeWithProgress(getter); + const listener1 = { + addSpan: vi.fn(), + removeSpan: vi.fn(), + }; + const listener2 = { + addSpan: vi.fn(), + removeSpan: vi.fn(), + }; + const promise = memoizedGetter({ + progressListener: listener1, + }); + memoizedGetter({ progressListener: listener2 }); + + getterResolve(); + + await promise; + + expect(listener1.addSpan).toHaveBeenCalledTimes(1); + expect(listener1.removeSpan).toHaveBeenCalledTimes(1); + expect(listener2.addSpan).toHaveBeenCalledTimes(1); + expect(listener2.removeSpan).toHaveBeenCalledTimes(1); + expect(getter).toHaveBeenCalledTimes(1); + }); + test("should not add and remove listener after completion", async () => { + const getter = vi.fn().mockResolvedValue("result"); + const memoizedGetter = asyncMemoizeWithProgress(getter); + const listener1 = { + addSpan: vi.fn(), + removeSpan: vi.fn(), + }; + const promise1 = memoizedGetter({ progressListener: listener1 }); + await promise1; + expect(getter).toBeCalledTimes(1); + const listener2 = { + addSpan: vi.fn(), + removeSpan: vi.fn(), + }; + memoizedGetter({ progressListener: listener2 }); // second call after the first completed + expect(listener2.addSpan).not.toBeCalled(); + expect(listener2.removeSpan).not.toBeCalled(); + expect(getter).toBeCalledTimes(1); // still 1 + }); +}); diff --git a/src/util/memoize.ts b/src/util/memoize.ts index c9da1cfbf4..7c1865f8c2 100644 --- a/src/util/memoize.ts +++ b/src/util/memoize.ts @@ -14,9 +14,12 @@ * limitations under the License. */ +import { raceWithAbort, SharedAbortController } from "#src/util/abort.js"; import type { RefCounted } from "#src/util/disposable.js"; import { RefCountedValue } from "#src/util/disposable.js"; import { stableStringify } from "#src/util/json.js"; +import type { ProgressOptions } from "#src/util/progress_listener.js"; +import { MultiConsumerProgressListener } from "#src/util/progress_listener.js"; export class Memoize { private map = new Map(); @@ -51,4 +54,119 @@ export class StringMemoize extends Memoize { getUncounted(x: any, getter: () => T) { return this.get(x, () => new RefCountedValue(getter())).value; } + + getAsync( + x: any, + options: Partial, + getter: (options: ProgressOptions) => Promise, + ) { + return this.getUncounted(x, () => asyncMemoizeWithProgress(getter))( + options, + ); + } +} + +export interface AsyncMemoize { + (options: { signal?: AbortSignal }): Promise; +} + +export interface AsyncMemoizeWithProgress { + (options: Partial): Promise; +} + +export function asyncMemoize( + getter: (options: { signal: AbortSignal }) => Promise, +): AsyncMemoize { + let abortController: SharedAbortController | undefined; + let promise: Promise | undefined; + let completed: boolean = false; + + return (options: { signal?: AbortSignal }): Promise => { + if (completed) { + return promise!; + } + const { signal } = options; + if (signal?.aborted) { + return Promise.reject(signal.reason); + } + if (promise === undefined || abortController!.signal.aborted) { + abortController = new SharedAbortController(); + const curAbortController = abortController; + promise = (async () => { + try { + return await getter({ + signal: curAbortController.signal, + }); + } catch (e) { + if (curAbortController.signal.aborted) { + promise = undefined; + } + throw e; + } finally { + if (promise !== undefined) { + completed = true; + } + curAbortController[Symbol.dispose](); + if (abortController === curAbortController) { + abortController = undefined; + } + } + })(); + } + abortController!.addConsumer(signal); + return raceWithAbort(promise, signal); + }; +} + +export function asyncMemoizeWithProgress( + getter: (options: ProgressOptions) => Promise, +): AsyncMemoizeWithProgress { + let progressListener: MultiConsumerProgressListener | undefined; + let abortController: SharedAbortController | undefined; + let promise: Promise | undefined; + let completed: boolean = false; + + return async (options: Partial): Promise => { + if (completed) { + return promise!; + } + const { signal } = options; + signal?.throwIfAborted(); + if (promise === undefined || abortController!.signal.aborted) { + progressListener = new MultiConsumerProgressListener(); + abortController = new SharedAbortController(); + const curAbortController = abortController; + promise = (async () => { + try { + return await getter({ + signal: curAbortController.signal, + progressListener: progressListener!, + }); + } catch (e) { + if (curAbortController.signal.aborted) { + promise = undefined; + } + throw e; + } finally { + if (promise !== undefined) { + completed = true; + } + progressListener = undefined; + curAbortController[Symbol.dispose](); + if (abortController === curAbortController) { + abortController = undefined; + } + } + })(); + } + abortController!.addConsumer(signal); + const curProgressListener = progressListener!; + curProgressListener.addListener(options.progressListener); + + try { + return await raceWithAbort(promise, signal); + } finally { + curProgressListener.removeListener(options.progressListener); + } + }; } diff --git a/src/util/npy.spec.ts b/src/util/npy.spec.ts index f5c55557cd..cc61084bf2 100644 --- a/src/util/npy.spec.ts +++ b/src/util/npy.spec.ts @@ -48,6 +48,8 @@ describe("parseNpy", () => { "..", "..", "testdata", + "codec", + "npy", ); const example = JSON.parse( await fs.readFile(`${testDataDir}/npy_test.${json}.json`, { diff --git a/src/util/pairing_heap.0.ts b/src/util/pairing_heap.0.ts index 10e222c028..394730db37 100644 --- a/src/util/pairing_heap.0.ts +++ b/src/util/pairing_heap.0.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/pairing_heap.template.ts. +// DO NOT EDIT. Generated from templates/util/pairing_heap.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -71,8 +71,7 @@ export default class Implementation> let head: T | null = null; while (true) { const curNext: T | null = cur.next0; - let next: T | null; - let m: T; + let next: T | null, m: T; if (curNext === null) { next = null; m = cur; diff --git a/src/util/pairing_heap.1.ts b/src/util/pairing_heap.1.ts index 3b4f5f3d66..e8cc96d86a 100644 --- a/src/util/pairing_heap.1.ts +++ b/src/util/pairing_heap.1.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/pairing_heap.template.ts. +// DO NOT EDIT. Generated from templates/util/pairing_heap.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -71,8 +71,7 @@ export default class Implementation> let head: T | null = null; while (true) { const curNext: T | null = cur.next1; - let next: T | null; - let m: T; + let next: T | null, m: T; if (curNext === null) { next = null; m = cur; diff --git a/src/util/polyfills.ts b/src/util/polyfills.ts new file mode 100644 index 0000000000..3a6325369b --- /dev/null +++ b/src/util/polyfills.ts @@ -0,0 +1,2 @@ +import "core-js/actual/symbol/dispose.js"; +import "core-js/actual/symbol/async-dispose.js"; diff --git a/src/util/progress_listener.ts b/src/util/progress_listener.ts new file mode 100644 index 0000000000..6c95858faf --- /dev/null +++ b/src/util/progress_listener.ts @@ -0,0 +1,177 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type ProgressSpanId = number; + +export interface ProgressSpanOptions { + message: string; + startTime?: number; + id?: ProgressSpanId; +} + +export class ProgressSpan implements Disposable { + id: ProgressSpanId; + startTime: number; + message: string; + + constructor( + public listener: ProgressListener, + options: ProgressSpanOptions, + ) { + const { id = Math.random(), startTime = Date.now(), message } = options; + this.id = id; + this.startTime = startTime; + this.message = message; + listener.addSpan(this); + } + + [Symbol.dispose]() { + this.listener.removeSpan(this.id); + } +} + +export interface ProgressListener { + addSpan(span: ProgressSpan): void; + removeSpan(spanId: ProgressSpanId): void; +} + +export class MultiSet { + private items = new Map(); + add(item: T): number { + const { items } = this; + const count = (items.get(item) ?? 0) + 1; + items.set(item, count); + return count; + } + + delete(item: T): number { + const { items } = this; + let count = items.get(item)!; + if (count > 1) { + count -= 1; + items.set(item, count); + return count; + } + items.delete(item); + return 0; + } + + has(item: T): boolean { + return this.items.has(item); + } + + keys() { + return this.items.keys(); + } + + entries() { + return this.items.entries(); + } + + [Symbol.iterator]() { + return this.items.keys(); + } +} + +export class KeyedMultiSet { + private items = new Map(); + constructor(private getKey: (value: T) => Key) {} + + add(item: T): number { + const { items } = this; + const key = this.getKey(item); + const obj = items.get(key); + if (obj === undefined) { + items.set(key, { value: item, count: 1 }); + return 1; + } else { + return (obj.count += 1); + } + } + + delete(item: T): number { + return this.deleteKey(this.getKey(item)); + } + + deleteKey(key: Key): number { + const { items } = this; + const obj = items.get(key); + if (obj !== undefined && obj.count > 1) { + return (obj.count -= 1); + } + items.delete(key); + return 0; + } + + has(item: T): boolean { + return this.items.has(this.getKey(item)); + } + + *[Symbol.iterator]() { + for (const obj of this.items.values()) { + yield obj.value; + } + } +} + +function getId(span: ProgressSpan) { + return span.id; +} + +export class ProgressSpanSet extends KeyedMultiSet { + constructor() { + super(getId); + } +} + +export class MultiConsumerProgressListener implements ProgressListener { + private spans = new ProgressSpanSet(); + private listeners = new MultiSet(); + addSpan(span: ProgressSpan) { + if (this.spans.add(span) !== 1) return; + for (const listener of this.listeners) { + listener.addSpan(span); + } + } + + removeSpan(spanId: ProgressSpanId) { + if (this.spans.deleteKey(spanId) !== 0) return; + for (const listener of this.listeners) { + listener.removeSpan(spanId); + } + } + + addListener(listener: ProgressListener | undefined) { + if (listener === undefined) return; + if (this.listeners.add(listener) !== 1) return; + for (const span of this.spans) { + listener.addSpan(span); + } + } + + removeListener(listener: ProgressListener | undefined) { + if (listener === undefined) return; + if (this.listeners.delete(listener) !== 0) return; + for (const span of this.spans) { + listener.removeSpan(span.id); + } + } +} + +export interface ProgressOptions { + signal: AbortSignal; + progressListener: ProgressListener; +} diff --git a/src/util/s3.ts b/src/util/s3.ts deleted file mode 100644 index e7be327c0e..0000000000 --- a/src/util/s3.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * @license - * Copyright 2021 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { cancellableFetchOk } from "#src/util/http_request.js"; -import { getS3CompatiblePathCompletions } from "#src/util/s3_bucket_listing.js"; - -// Support for s3:// special protocol. - -export async function cancellableFetchS3Ok( - bucket: string, - path: string, - requestInit: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -) { - return await cancellableFetchOk( - `https://${bucket}.s3.amazonaws.com${path}`, - requestInit, - transformResponse, - cancellationToken, - ); -} - -export async function getS3PathCompletions( - bucket: string, - path: string, - cancellationToken: CancellationToken, -) { - return await getS3CompatiblePathCompletions( - undefined, - `s3://${bucket}`, - `https://${bucket}.s3.amazonaws.com`, - path, - cancellationToken, - ); -} diff --git a/src/util/s3_bucket_listing.ts b/src/util/s3_bucket_listing.ts deleted file mode 100644 index 39540266d7..0000000000 --- a/src/util/s3_bucket_listing.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * @license - * Copyright 2019 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file Provides file listing and completion for storage systems supporting the S3 XML API (e.g. S3 - * and GCS). - */ - -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import type { BasicCompletionResult } from "#src/util/completion.js"; -import type { SpecialProtocolCredentialsProvider } from "#src/util/special_protocol_request.js"; - -export async function getS3BucketListing( - credentialsProvider: SpecialProtocolCredentialsProvider, - bucketUrl: string, - prefix: string, - delimiter: string, - cancellationToken: CancellationToken, -): Promise { - const response = await fetchWithOAuth2Credentials( - credentialsProvider, - `${bucketUrl}?prefix=${encodeURIComponent(prefix)}` + - `&delimiter=${encodeURIComponent(delimiter)}`, - /*init=*/ {}, - (x) => x.text(), - cancellationToken, - ); - const doc = new DOMParser().parseFromString(response, "application/xml"); - const commonPrefixNodes = doc.evaluate( - '//*[name()="CommonPrefixes"]/*[name()="Prefix"]', - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - const results: string[] = []; - for (let i = 0, n = commonPrefixNodes.snapshotLength; i < n; ++i) { - results.push(commonPrefixNodes.snapshotItem(i)!.textContent || ""); - } - const contents = doc.evaluate( - '//*[name()="Contents"]/*[name()="Key"]', - doc, - null, - XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, - null, - ); - for (let i = 0, n = contents.snapshotLength; i < n; ++i) { - results.push(contents.snapshotItem(i)!.textContent || ""); - } - return results; -} - -export async function getS3CompatiblePathCompletions( - credentialsProvider: SpecialProtocolCredentialsProvider, - enteredBucketUrl: string, - bucketUrl: string, - path: string, - cancellationToken: CancellationToken, -): Promise { - const prefix = path; - if (!prefix.startsWith("/")) throw null; - const paths = await getS3BucketListing( - credentialsProvider, - bucketUrl, - path.substring(1), - "/", - cancellationToken, - ); - const offset = path.lastIndexOf("/"); - return { - offset: offset + enteredBucketUrl.length + 1, - completions: paths.map((x) => ({ value: x.substring(offset) })), - }; -} diff --git a/src/util/screenshot_manager.ts b/src/util/screenshot_manager.ts new file mode 100644 index 0000000000..5c48b6d049 --- /dev/null +++ b/src/util/screenshot_manager.ts @@ -0,0 +1,474 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use viewer file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file Builds upon the Python screenshot tool to allow viewer screenshots to be taken and saved. + */ + +import { throttle } from "lodash-es"; +import { numChunkStatistics } from "#src/chunk_manager/base.js"; +import type { + ScreenshotActionState, + StatisticsActionState, + ScreenshotChunkStatistics, +} from "#src/python_integration/screenshots.js"; +import { SliceViewPanel } from "#src/sliceview/panel.js"; +import { StatusMessage } from "#src/status.js"; +import { + columnSpecifications, + getChunkSourceIdentifier, + getFormattedNames, +} from "#src/ui/statistics.js"; +import { RefCounted } from "#src/util/disposable.js"; +import { NullarySignal, Signal } from "#src/util/signal.js"; +import { ScreenshotMode } from "#src/util/trackable_screenshot_mode.js"; +import { + calculatePanelViewportBounds, + type PanelViewport, +} from "#src/util/viewer_resolution_stats.js"; +import type { Viewer } from "#src/viewer.js"; + +export const MAX_RENDER_AREA_PIXELS = 5100 * 5100; +const SCREENSHOT_TIMEOUT = 3000; + +export interface ScreenshotLoadStatistics extends ScreenshotChunkStatistics { + timestamp: number; + gpuMemoryCapacity: number; +} + +function saveBlobToFile(blob: Blob, filename: string) { + const a = document.createElement("a"); + const url = URL.createObjectURL(blob); + a.href = url; + a.download = filename; + try { + a.click(); + } finally { + URL.revokeObjectURL(url); + } +} + +function setExtension(filename: string, extension: string = ".png"): string { + function replaceExtension(filename: string): string { + const lastDot = filename.lastIndexOf("."); + if (lastDot === -1) { + return filename + extension; + } + return `${filename.substring(0, lastDot)}${extension}`; + } + + return filename.endsWith(extension) ? filename : replaceExtension(filename); +} + +function canvasToBlob(canvas: HTMLCanvasElement, type: string): Promise { + return new Promise((resolve, reject) => { + canvas.toBlob((blob) => { + if (blob) { + resolve(blob); + } else { + reject(new Error("Canvas toBlob failed")); + } + }, type); + }); +} + +async function extractViewportScreenshot( + viewer: Viewer, + viewportBounds: PanelViewport, +): Promise { + const cropWidth = viewportBounds.right - viewportBounds.left; + const cropHeight = viewportBounds.bottom - viewportBounds.top; + const img = await createImageBitmap( + viewer.display.canvas, + viewportBounds.left, + viewportBounds.top, + cropWidth, + cropHeight, + ); + + const screenshotCanvas = document.createElement("canvas"); + screenshotCanvas.width = cropWidth; + screenshotCanvas.height = cropHeight; + const ctx = screenshotCanvas.getContext("2d"); + if (!ctx) throw new Error("Failed to get canvas context"); + ctx.drawImage(img, 0, 0); + + const croppedBlob = await canvasToBlob(screenshotCanvas, "image/png"); + return croppedBlob; +} + +/** + * Manages the screenshot functionality from the viewer viewer. + * + * Responsible for linking up the Python screenshot tool with the viewer, and handling the screenshot process. + * The screenshot manager provides information about updates in the screenshot process, and allows for the screenshot to be taken and saved. + * The screenshot UI menu listens to the signals emitted by the screenshot manager to update the UI. + */ +export class ScreenshotManager extends RefCounted { + screenshotId: number = -1; + screenshotLoadStats: ScreenshotLoadStatistics | null = null; + screenshotStartTime = 0; + screenshotMode: ScreenshotMode = ScreenshotMode.OFF; + statisticsUpdated = new Signal<(state: ScreenshotLoadStatistics) => void>(); + screenshotFinished = new NullarySignal(); + zoomMaybeChanged = new NullarySignal(); + private _shouldKeepSliceViewFOVFixed: boolean = true; + private _screenshotScale: number = 1; + private filename: string = ""; + private lastUpdateTimestamp: number = 0; + private gpuMemoryChangeTimestamp: number = 0; + throttledSendStatistics = this.registerCancellable( + throttle(async () => { + const map = await this.viewer.chunkQueueManager.getStatistics(); + if (this.wasDisposed) return; + const formattedNames = getFormattedNames( + Array.from(map, (x) => getChunkSourceIdentifier(x[0])), + ); + let i = 0; + const rows: any[] = []; + const sumStatistics = new Float64Array(numChunkStatistics); + for (const [source, statistics] of map) { + for (let i = 0; i < numChunkStatistics; ++i) { + sumStatistics[i] += statistics[i]; + } + const row: any = {}; + row.id = getChunkSourceIdentifier(source); + row.distinctId = formattedNames[i]; + for (const column of columnSpecifications) { + row[column.key] = column.getter(statistics); + } + ++i; + rows.push(row); + } + const total: any = {}; + for (const column of columnSpecifications) { + total[column.key] = column.getter(sumStatistics); + } + const screenshotLoadStats = { + ...total, + timestamp: Date.now(), + gpuMemoryCapacity: + this.viewer.chunkQueueManager.capacities.gpuMemory.sizeLimit.value, + }; + this.statisticsUpdated.dispatch(screenshotLoadStats); + }, 1000), + ); + + constructor(public viewer: Viewer) { + super(); + this.viewer = viewer; + this.registerDisposer( + this.viewer.screenshotHandler.sendScreenshotRequested.add( + (actionState) => { + this.saveScreenshot(actionState); + }, + ), + ); + this.registerDisposer( + this.viewer.screenshotHandler.sendStatisticsRequested.add( + (actionState) => { + const newLoadStats = { + ...actionState.screenshotStatistics.total, + timestamp: Date.now(), + gpuMemoryCapacity: + this.viewer.chunkQueueManager.capacities.gpuMemory.sizeLimit + .value, + }; + this.checkAndHandleStalledScreenshot(actionState, newLoadStats); + this.screenshotLoadStats = newLoadStats; + }, + ), + ); + this.registerDisposer( + this.viewer.display.updateFinished.add(() => { + this.lastUpdateTimestamp = Date.now(); + this.throttledSendStatistics(); + }), + ); + this.registerDisposer( + this.viewer.display.screenshotMode.changed.add(() => { + this.handleScreenshotModeChange(); + }), + ); + } + + public get screenshotScale() { + return this._screenshotScale; + } + + public set screenshotScale(scale: number) { + this._screenshotScale = this.handleScreenshotZoomAndResize(scale); + this.zoomMaybeChanged.dispatch(); + } + + public get shouldKeepSliceViewFOVFixed() { + return this._shouldKeepSliceViewFOVFixed; + } + + public set shouldKeepSliceViewFOVFixed(enableFixedFOV: boolean) { + const wasInFixedFOVMode = this.shouldKeepSliceViewFOVFixed; + this._shouldKeepSliceViewFOVFixed = enableFixedFOV; + if (!enableFixedFOV && wasInFixedFOVMode) { + this.handleScreenshotZoomAndResize( + this.screenshotScale, + true /* resetZoom */, + ); + this.zoomMaybeChanged.dispatch(); + } else if (enableFixedFOV && !wasInFixedFOVMode) { + this.handleScreenshotZoomAndResize( + 1 / this.screenshotScale, + true /* resetZoom */, + ); + this.zoomMaybeChanged.dispatch(); + } + } + + previewScreenshot() { + this.viewer.display.screenshotMode.value = ScreenshotMode.PREVIEW; + } + + takeScreenshot(filename: string = "") { + this.filename = filename; + this.viewer.display.screenshotMode.value = ScreenshotMode.ON; + } + + forceScreenshot() { + this.viewer.display.screenshotMode.value = ScreenshotMode.FORCE; + } + + cancelScreenshot(shouldStayInPreview: boolean = false) { + // Decrement the screenshot ID since the screenshot was cancelled + if (this.screenshotMode === ScreenshotMode.ON) { + this.screenshotId--; + } + const newMode = shouldStayInPreview + ? ScreenshotMode.PREVIEW + : ScreenshotMode.OFF; + this.viewer.display.screenshotMode.value = newMode; + } + + // Calculates the cropped area of the viewport panels + calculatedClippedViewportSize(): { + width: number; + height: number; + } { + const renderingPanelArea = calculatePanelViewportBounds( + this.viewer.display.panels, + ).totalRenderPanelViewport; + return { + width: Math.round(renderingPanelArea.right - renderingPanelArea.left), + height: Math.round(renderingPanelArea.bottom - renderingPanelArea.top), + }; + } + + private handleScreenshotStarted() { + this.screenshotStartTime = + this.lastUpdateTimestamp = + this.gpuMemoryChangeTimestamp = + Date.now(); + this.screenshotLoadStats = null; + + // Pass a new screenshot ID to the viewer to trigger a new screenshot. + this.screenshotId++; + this.viewer.screenshotHandler.requestState.value = + this.screenshotId.toString(); + } + + private resizeCanvasIfNeeded(scale: number = this.screenshotScale) { + const shouldChangeCanvasSize = scale !== 1; + const { viewer } = this; + if (shouldChangeCanvasSize) { + const oldSize = { + width: viewer.display.canvas.width, + height: viewer.display.canvas.height, + }; + const newSize = { + width: Math.round(oldSize.width * scale), + height: Math.round(oldSize.height * scale), + }; + viewer.display.canvas.width = newSize.width; + viewer.display.canvas.height = newSize.height; + viewer.display.resizeCallback(); + } + } + + private handleScreenshotModeChange() { + const { display } = this.viewer; + // If moving straight from OFF to ON, need to resize the canvas to the correct size + const mayNeedCanvasResize = this.screenshotMode === ScreenshotMode.OFF; + this.screenshotMode = display.screenshotMode.value; + switch (this.screenshotMode) { + case ScreenshotMode.OFF: + this.resetCanvasSize(); + this.resetStatistics(); + this.viewer.screenshotHandler.requestState.value = undefined; + break; + case ScreenshotMode.FORCE: + display.scheduleRedraw(); + break; + case ScreenshotMode.ON: + // If moving straight from OFF to ON, may need to resize the canvas to the correct size + // Going from PREVIEW to ON does not require a resize + if (mayNeedCanvasResize) { + this.resizeCanvasIfNeeded(); + } + this.handleScreenshotStarted(); + break; + case ScreenshotMode.PREVIEW: + // Do nothing, included for completeness + break; + } + } + + /** + * Handles the zooming of the screenshot in fixed FOV mode. + * This supports: + * 1. Updating the zoom level of the viewer to match the screenshot scale. + * 2. Resetting the zoom level of the slice views to the original level. + * 3. Resizing the canvas to match the new scale. + * @param scale - The scale factor to apply to the screenshot. + * @param resetZoom - If true, the zoom resets to the original level. + */ + private handleScreenshotZoomAndResize( + scale: number, + resetZoom: boolean = false, + ) { + const oldScale = this.screenshotScale; + + // Because the scale is applied to the canvas, we need to check if the new scale will exceed the maximum render area + // If so, that means the scale needs to be adjusted to fit within the maximum render area + let intendedScale = scale; + if (!resetZoom && scale > 1) { + const currentCanvasSize = this.calculatedClippedViewportSize(); + const numPixels = + (currentCanvasSize.width * currentCanvasSize.height) / + (oldScale * oldScale); + if (numPixels * intendedScale * intendedScale > MAX_RENDER_AREA_PIXELS) { + intendedScale = Math.sqrt(MAX_RENDER_AREA_PIXELS / numPixels); + } + } + + const scaleFactor = intendedScale / oldScale; + const zoomScaleFactor = resetZoom ? scale : 1 / scaleFactor; + const canvasScaleFactor = resetZoom ? 1 : scaleFactor; + + if (this.shouldKeepSliceViewFOVFixed || resetZoom) { + // Scale the zoom factor of each slice view panel + const { navigationState } = this.viewer; + for (const panel of this.viewer.display.panels) { + if (panel instanceof SliceViewPanel) { + const zoom = navigationState.zoomFactor.value; + navigationState.zoomFactor.value = zoom * zoomScaleFactor; + break; + } + } + } + + this.resizeCanvasIfNeeded(canvasScaleFactor); + + return intendedScale; + } + + /** + * Check if the screenshot is stuck by comparing the number of visible chunks + * in the GPU with the previous number of visible chunks. If the number of + * visible chunks has not changed after a certain timeout, and the display has not updated, force a screenshot. + */ + private checkAndHandleStalledScreenshot( + actionState: StatisticsActionState, + fullStats: ScreenshotLoadStatistics, + ) { + if (this.screenshotLoadStats === null) { + return; + } + const total = actionState.screenshotStatistics.total; + const newStats = { + visibleChunksGpuMemory: total.visibleChunksGpuMemory, + timestamp: Date.now(), + totalGpuMemory: + this.viewer.chunkQueueManager.capacities.gpuMemory.sizeLimit.value, + numDownloadingChunks: total.visibleChunksDownloading, + }; + const oldStats = this.screenshotLoadStats; + if ( + oldStats.visibleChunksGpuMemory === newStats.visibleChunksGpuMemory && + (oldStats.gpuMemoryCapacity === newStats.totalGpuMemory || + newStats.numDownloadingChunks == 0) + ) { + if ( + newStats.timestamp - this.gpuMemoryChangeTimestamp > + SCREENSHOT_TIMEOUT && + Date.now() - this.lastUpdateTimestamp > SCREENSHOT_TIMEOUT + ) { + this.statisticsUpdated.dispatch(fullStats); + const message = `Forcing screenshot: screenshot is likely stuck, no change in GPU chunks after ${SCREENSHOT_TIMEOUT}ms. Last visible chunks: ${total.visibleChunksGpuMemory}/${total.visibleChunksTotal}`; + console.warn(message); + StatusMessage.showTemporaryMessage(message, 5000); + this.forceScreenshot(); + } + } else { + this.gpuMemoryChangeTimestamp = newStats.timestamp; + } + } + + private async saveScreenshot(actionState: ScreenshotActionState) { + const { screenshot } = actionState; + const { imageType } = screenshot; + if (imageType !== "image/png") { + console.error("Image type is not PNG"); + this.viewer.display.screenshotMode.value = ScreenshotMode.OFF; + return; + } + const renderingPanelArea = calculatePanelViewportBounds( + this.viewer.display.panels, + ).totalRenderPanelViewport; + try { + const croppedImage = await extractViewportScreenshot( + this.viewer, + renderingPanelArea, + ); + this.generateFilename( + renderingPanelArea.right - renderingPanelArea.left, + renderingPanelArea.bottom - renderingPanelArea.top, + ); + saveBlobToFile(croppedImage, this.filename); + } catch (error) { + console.error("Failed to save screenshot:", error); + } finally { + this.viewer.display.screenshotMode.value = ScreenshotMode.OFF; + this.screenshotFinished.dispatch(); + } + } + + private resetCanvasSize() { + // Reset the canvas size to the original size + // No need to manually pass the correct sizes, the viewer will handle it + const { viewer } = this; + ++viewer.display.resizeGeneration; + viewer.display.resizeCallback(); + } + + private resetStatistics() { + this.screenshotLoadStats = null; + } + + private generateFilename(width: number, height: number): string { + if (!this.filename) { + const nowtime = new Date().toLocaleString().replace(", ", "-"); + this.filename = `neuroglancer-screenshot-w${width}px-h${height}px-at-${nowtime}`; + } + this.filename = setExtension(this.filename); + return this.filename; + } +} diff --git a/src/util/signal.ts b/src/util/signal.ts index 52ca03c34b..4a7031e013 100644 --- a/src/util/signal.ts +++ b/src/util/signal.ts @@ -61,6 +61,15 @@ export class Signal void> { }; } + addOnce(handler: Callable): void { + const { handlers } = this; + function onceWrapper(...args: any) { + handlers.delete(onceWrapper as any); + handler(...args); + } + handlers.add(onceWrapper as any); + } + /** * Remove a handler function. If `dispatch` is currently be called and the new handler has not * yet been called, then it will not be called. @@ -117,6 +126,7 @@ export class NullarySignal extends Signal<() => void> {} export interface ReadonlySignal { readonly count: number; add(handler: Callable): () => void; + addOnce(handler: Callable): void; remove(handler: Callable): boolean; } @@ -127,6 +137,7 @@ export const neverSignal: NullaryReadonlySignal = { add(_handler: any) { return () => {}; }, + addOnce(_handler: any) {}, remove(_handler: any) { return false; }, diff --git a/src/util/special_protocol_request.ts b/src/util/special_protocol_request.ts deleted file mode 100644 index f79590b789..0000000000 --- a/src/util/special_protocol_request.ts +++ /dev/null @@ -1,197 +0,0 @@ -/** - * @license - * Copyright 2020 Google Inc. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import pythonIntegration from "#python_integration_build"; -import type { - CredentialsManager, - MaybeOptionalCredentialsProvider, -} from "#src/credentials_provider/index.js"; -import { fetchWithOAuth2Credentials } from "#src/credentials_provider/oauth2.js"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { uncancelableToken } from "#src/util/cancellation.js"; -import type { ResponseTransform } from "#src/util/http_request.js"; -import { parseUrl } from "#src/util/http_request.js"; -import { getRandomHexString } from "#src/util/random.js"; -import { cancellableFetchS3Ok } from "#src/util/s3.js"; - -export type SpecialProtocolCredentials = any; -export type SpecialProtocolCredentialsProvider = - MaybeOptionalCredentialsProvider; - -function getMiddleAuthCredentialsProvider( - credentialsManager: CredentialsManager, - url: string, -): SpecialProtocolCredentialsProvider { - return credentialsManager.getCredentialsProvider( - "middleauthapp", - new URL(url).origin, - ); -} - -function getNgauthCredentialsProvider( - credentialsManager: CredentialsManager, - serverUrl: string, - path: string, -): SpecialProtocolCredentialsProvider { - const bucketPattern = /^\/([^/]+)/; - const m = path.match(bucketPattern); - if (m === null) return undefined; - return pythonIntegration - ? credentialsManager.getCredentialsProvider("gcs", { bucket: m[1] }) - : credentialsManager.getCredentialsProvider("ngauth_gcs", { - authServer: serverUrl, - bucket: m[1], - }); -} - -export function parseSpecialUrl( - url: string, - credentialsManager: CredentialsManager, -): { url: string; credentialsProvider: SpecialProtocolCredentialsProvider } { - const u = parseUrl(url); - switch (u.protocol) { - case "gs": - case "gs+xml": - return { - credentialsProvider: pythonIntegration - ? credentialsManager.getCredentialsProvider("gcs", { - bucket: u.host, - }) - : undefined, - url, - }; - case "gs+ngauth+http": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `http://${u.host}`, - u.path, - ), - url: "gs:/" + u.path, - }; - case "gs+ngauth+https": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `https://${u.host}`, - u.path, - ), - url: "gs:/" + u.path, - }; - case "gs+xml+ngauth+http": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `http://${u.host}`, - u.path, - ), - url: "gs+xml:/" + u.path, - }; - case "gs+xml+ngauth+https": - return { - credentialsProvider: getNgauthCredentialsProvider( - credentialsManager, - `https://${u.host}`, - u.path, - ), - url: "gs+xml:/" + u.path, - }; - case "middleauth+https": - url = url.substr("middleauth+".length); - return { - credentialsProvider: getMiddleAuthCredentialsProvider( - credentialsManager, - url, - ), - url: url, - }; - case "s3": - return { - credentialsProvider: undefined, - url, - }; - default: - return { - credentialsProvider: undefined, - url, - }; - } -} - -export async function cancellableFetchSpecialOk( - credentialsProvider: SpecialProtocolCredentialsProvider, - url: string, - init: RequestInit, - transformResponse: ResponseTransform, - cancellationToken: CancellationToken = uncancelableToken, -): Promise { - const u = parseUrl(url); - switch (u.protocol) { - case "gs": - // Include random query string parameter (ignored by GCS) to bypass GCS cache and ensure a - // cached response is never used. - // - // This addresses two issues related to GCS: - // - // 1. GCS fails to send an updated `Access-Control-Allow-Origin` header in 304 responses to - // cache revalidation requests. - // - // https://bugs.chromium.org/p/chromium/issues/detail?id=1214563#c2 - // - // The random query string parameter ensures cached responses are never used. - // - // Note: This issue does not apply to gs+xml because with the XML API, the - // Access-Control-Allow-Origin response header does not vary with the Origin. - // - // 2. If the object does not prohibit caching (e.g. public bucket and default `cache-control` - // metadata value), GCS may return stale responses. - // - return fetchWithOAuth2Credentials( - credentialsProvider, - `https://www.googleapis.com/storage/v1/b/${u.host}/o/` + - `${encodeURIComponent(u.path.substring(1))}?alt=media` + - `&neuroglancer=${getRandomHexString()}`, - init, - transformResponse, - cancellationToken, - ); - case "gs+xml": - return fetchWithOAuth2Credentials( - credentialsProvider, - `https://storage.googleapis.com/${u.host}${u.path}` + - `?neuroglancer=${getRandomHexString()}`, - init, - transformResponse, - cancellationToken, - ); - case "s3": - return cancellableFetchS3Ok( - u.host, - u.path, - init, - transformResponse, - cancellationToken, - ); - default: - return fetchWithOAuth2Credentials( - credentialsProvider, - url, - init, - transformResponse, - cancellationToken, - ); - } -} diff --git a/src/util/trackable_screenshot_mode.ts b/src/util/trackable_screenshot_mode.ts new file mode 100644 index 0000000000..d6414a45df --- /dev/null +++ b/src/util/trackable_screenshot_mode.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use viewer file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TrackableEnum } from "#src/util/trackable_enum.js"; + +export enum ScreenshotMode { + OFF = 0, // Default mode + ON = 1, // Screenshot mode + FORCE = 2, // Force screenshot mode - used when the screenshot is stuck + PREVIEW = 3, // Preview mode - used while the user is in the screenshot menu +} + +export class TrackableScreenshotMode extends TrackableEnum { + constructor(value: ScreenshotMode, defaultValue: ScreenshotMode = value) { + super(ScreenshotMode, value, defaultValue); + } +} diff --git a/src/util/uint16array_builder.ts b/src/util/uint16array_builder.ts index 6383bca489..34606cb4b6 100644 --- a/src/util/uint16array_builder.ts +++ b/src/util/uint16array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint16ArrayBuilder { length = 0; - data: Uint16Array; + data: Uint16Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint16Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint16ArrayBuilder { get view() { const { data } = this; - return new Uint16Array(data.buffer, data.byteOffset, this.length); + return new Uint16Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/uint32array_builder.ts b/src/util/uint32array_builder.ts index 3bc6b50ac4..856e0ef367 100644 --- a/src/util/uint32array_builder.ts +++ b/src/util/uint32array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint32ArrayBuilder { length = 0; - data: Uint32Array; + data: Uint32Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint32Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint32ArrayBuilder { get view() { const { data } = this; - return new Uint32Array(data.buffer, data.byteOffset, this.length); + return new Uint32Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/uint64.ts b/src/util/uint64.ts index 7a05caddc3..fd9fb355f1 100644 --- a/src/util/uint64.ts +++ b/src/util/uint64.ts @@ -338,6 +338,10 @@ export class Uint64 { return this.low + this.high * 0x100000000; } + toBigInt() { + return BigInt(this.low) | (BigInt(this.high) << BigInt(32)); + } + setFromNumber(value: number) { value = Math.round(value); if (value < 0) { diff --git a/src/util/uint8array_builder.ts b/src/util/uint8array_builder.ts index 9519a8261c..78d27f9074 100644 --- a/src/util/uint8array_builder.ts +++ b/src/util/uint8array_builder.ts @@ -1,4 +1,4 @@ -// DO NOT EDIT. Generated from templates/neuroglancer/util/typedarray_builder.template.ts. +// DO NOT EDIT. Generated from templates/util/typedarray_builder.template.ts. /** * @license * Copyright 2016 Google Inc. @@ -17,9 +17,9 @@ export class Uint8ArrayBuilder { length = 0; - data: Uint8Array; + data: Uint8Array; - constructor(initialCapacity = 16) { + constructor(initialCapacity: number = 16) { this.data = new Uint8Array(initialCapacity); } @@ -35,7 +35,11 @@ export class Uint8ArrayBuilder { get view() { const { data } = this; - return new Uint8Array(data.buffer, data.byteOffset, this.length); + return new Uint8Array( + data.buffer, + data.byteOffset, + this.length, + ); } shrinkToFit() { diff --git a/src/util/viewer_resolution_stats.ts b/src/util/viewer_resolution_stats.ts new file mode 100644 index 0000000000..c31b84620f --- /dev/null +++ b/src/util/viewer_resolution_stats.ts @@ -0,0 +1,480 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use viewer file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @file Helper functions to get the resolution of the viewer layers and panels. + */ + +import type { RenderedPanel } from "#src/display_context.js"; +import { PerspectivePanel } from "#src/perspective_view/panel.js"; +import { RenderedDataPanel } from "#src/rendered_data_panel.js"; +import { RenderLayerRole } from "#src/renderlayer.js"; +import { SliceViewPanel } from "#src/sliceview/panel.js"; +import { ImageRenderLayer } from "#src/sliceview/volume/image_renderlayer.js"; +import { SegmentationRenderLayer } from "#src/sliceview/volume/segmentation_renderlayer.js"; +import { formatScaleWithUnitAsString } from "#src/util/si_units.js"; +import type { Viewer } from "#src/viewer.js"; +import { VolumeRenderingRenderLayer } from "#src/volume_rendering/volume_render_layer.js"; + +export interface DimensionResolutionStats { + panelType: string; + dimensionName: string; + resolutionWithUnit: string; +} + +export interface PanelViewport { + left: number; + right: number; + top: number; + bottom: number; + panelType: string; +} + +export interface ResolutionMetadata { + panelResolutionData: PanelResolutionData[]; + layerResolutionData: LayerResolutionData[]; +} + +interface PanelResolutionData { + type: string; + width: number; + height: number; + resolution: string; +} + +interface LayerResolutionData { + name: string; + type: string; + resolution: string; +} + +interface LayerIdentifier { + name: string; + type: string; +} + +interface PanelResolutionStats { + pixelResolution: PanelViewport; + physicalResolution: DimensionResolutionStats[]; +} + +interface CanvasSizeStatistics { + totalRenderPanelViewport: PanelViewport; + individualRenderPanelViewports: PanelViewport[]; +} + +/** + * For each visible data layer, returns the resolution of the voxels + * in physical units for the most detailed resolution of the data for + * which any data is actually loaded. + * + * The resolution is for loaded data, so may be lower than the resolution requested + * for the layer, such as when there are memory constraints. + * + * The key for the returned map is the layer name and type. + * A single layer name can have multiple types, such as ImageRenderLayer and + * VolumeRenderingRenderLayer from the same named layer. + * + * As the dimensions of the voxels can be the same in each dimension, the + * function will return a single resolution if all dimensions in the layer are the + * same, with the name "All_". Otherwise, it will return the resolution for + * each dimension, with the name of the dimension as per the global viewer dim names. + */ +export function getViewerLayerResolutions( + viewer: Viewer, +): Map { + function formatResolution( + resolution: Float32Array | undefined, + parentType: string, + ): DimensionResolutionStats[] { + if (resolution === undefined) return []; + + const resolutionStats: DimensionResolutionStats[] = []; + const { + globalDimensionNames, + displayDimensionUnits, + displayDimensionIndices, + } = viewer.navigationState.displayDimensionRenderInfo.value; + + // Check if all units and factors are the same. + const firstDim = displayDimensionIndices[0]; + let singleScale = true; + if (firstDim !== -1) { + const unit = displayDimensionUnits[0]; + const factor = resolution[0]; + for (let i = 1; i < 3; ++i) { + const dim = displayDimensionIndices[i]; + if (dim === -1) continue; + if (displayDimensionUnits[i] !== unit || factor !== resolution[i]) { + singleScale = false; + break; + } + } + } + + for (let i = 0; i < 3; ++i) { + const dim = displayDimensionIndices[i]; + if (dim !== -1) { + const dimensionName = globalDimensionNames[dim]; + if (i === 0 || !singleScale) { + const formattedScale = formatScaleWithUnitAsString( + resolution[i], + displayDimensionUnits[i], + { precision: 2, elide1: false }, + ); + resolutionStats.push({ + panelType: parentType, + resolutionWithUnit: `${formattedScale}`, + dimensionName: singleScale ? "All_" : dimensionName, + }); + } + } + } + return resolutionStats; + } + + const layers = viewer.layerManager.visibleRenderLayers; + const map = new Map(); + + for (const layer of layers) { + if (layer.role === RenderLayerRole.DATA) { + let isVisble = false; + const name = layer.userLayer!.managedLayer.name; + let type: string = ""; + let resolution: Float32Array | undefined; + if (layer instanceof ImageRenderLayer) { + type = "ImageRenderLayer"; + isVisble = layer.visibleSourcesList.length > 0; + resolution = layer.highestResolutionLoadedVoxelSize; + } else if (layer instanceof VolumeRenderingRenderLayer) { + type = "VolumeRenderingRenderLayer"; + isVisble = layer.visibility.visible; + resolution = layer.highestResolutionLoadedVoxelSize; + } else if (layer instanceof SegmentationRenderLayer) { + type = "SegmentationRenderLayer"; + isVisble = layer.visibleSourcesList.length > 0; + resolution = layer.highestResolutionLoadedVoxelSize; + } + if (!isVisble) continue; + map.set({ name, type }, formatResolution(resolution, type)); + } + } + return map; +} + +/** + * For each viewer panel, returns the scale in each dimension for that panel. + * + * It is quite common for all dimensions to have the same scale, so the function + * will return a single resolution for a panel if all dimensions in the panel are + * the same, with the name "All_". Otherwise, it will return the resolution for + * each dimension, with the name of the dimension as per the global dimension names. + * + * For orthographic projections or slice views, the scale is in pixels, otherwise it is in vh. + * + * @param panels The set of panels to get the resolutions for. E.g. viewer.display.panels + * @param onlyUniqueResolutions If true, only return panels with unique resolutions. + * It is quite common for all slice view panels to have the same resolution. + * + * @returns An array of resolutions for each panel, both in physical units and pixel units. + */ +export function getViewerPanelResolutions( + panels: ReadonlySet, + onlyUniqueResolutions = true, +): PanelResolutionStats[] { + /** + * Two panels are equivalent if they have the same physical and pixel resolution. + */ + function arePanelsEquivalent( + panelResolution1: PanelResolutionStats, + panelResolution2: PanelResolutionStats, + ) { + // Step 1 - Check if the physical resolution is the same. + const physicalResolution1 = panelResolution1.physicalResolution; + const physicalResolution2 = panelResolution2.physicalResolution; + + // E.g., if one panel has X, Y, Z the same (length 1) and the other + // has X, Y, Z different (length 3), they are not the same. + if (physicalResolution1.length !== physicalResolution2.length) { + return false; + } + // Compare the units and values of the physical resolution dims. + for (let i = 0; i < physicalResolution1.length; ++i) { + const res1 = physicalResolution1[i]; + const res2 = physicalResolution2[i]; + if ( + res1.resolutionWithUnit !== res2.resolutionWithUnit || + res1.panelType !== res2.panelType || + res1.dimensionName !== res2.dimensionName + ) { + return false; + } + } + const pixelResolution1 = panelResolution1.pixelResolution; + const pixelResolution2 = panelResolution2.pixelResolution; + // In some cases, the pixel resolution can be a floating point number - round. + // Particularly prevalent on high pixel density displays. + const width1 = Math.round(pixelResolution1.right - pixelResolution1.left); + const width2 = Math.round(pixelResolution2.right - pixelResolution2.left); + const height1 = Math.round(pixelResolution1.bottom - pixelResolution1.top); + const height2 = Math.round(pixelResolution2.bottom - pixelResolution2.top); + return width1 === width2 && height1 === height2; + } + + // Gather the physical and pixel resolutions for each panel. + const resolutions: PanelResolutionStats[] = []; + for (const panel of panels) { + if (!(panel instanceof RenderedDataPanel)) continue; + const viewport = panel.renderViewport; + const { width, height } = viewport; + const panelLeft = panel.canvasRelativeClippedLeft; + const panelTop = panel.canvasRelativeClippedTop; + const panelRight = panelLeft + width; + const panelBottom = panelTop + height; + const { + panelType, + panelDimensionUnit, + }: { panelType: string; panelDimensionUnit: string } = + determinePanelTypeAndUnit(panel); + const panelResolution: PanelResolutionStats = { + pixelResolution: { + left: panelLeft, + right: panelRight, + top: panelTop, + bottom: panelBottom, + panelType, + }, + physicalResolution: [], + }; + const { physicalResolution } = panelResolution; + const { navigationState } = panel; + const { + displayDimensionIndices, + canonicalVoxelFactors, + displayDimensionUnits, + displayDimensionScales, + globalDimensionNames, + } = navigationState.displayDimensionRenderInfo.value; + const { factors } = navigationState.relativeDisplayScales.value; + const zoom = navigationState.zoomFactor.value; + // Check if all units and factors are the same. + const firstDim = displayDimensionIndices[0]; + let singleScale = true; + if (firstDim !== -1) { + const unit = displayDimensionUnits[0]; + const factor = factors[firstDim]; + for (let i = 1; i < 3; ++i) { + const dim = displayDimensionIndices[i]; + if (dim === -1) continue; + if (displayDimensionUnits[i] !== unit || factors[dim] !== factor) { + singleScale = false; + break; + } + } + } + for (let i = 0; i < 3; ++i) { + const dim = displayDimensionIndices[i]; + if (dim !== -1) { + const totalScale = + (displayDimensionScales[i] * zoom) / canonicalVoxelFactors[i]; + const dimensionName = globalDimensionNames[dim]; + if (i === 0 || !singleScale) { + const formattedScale = formatScaleWithUnitAsString( + totalScale, + displayDimensionUnits[i], + { precision: 2, elide1: false }, + ); + physicalResolution.push({ + panelType: panelType, + resolutionWithUnit: `${formattedScale}/${panelDimensionUnit}`, + dimensionName: singleScale ? "All_" : dimensionName, + }); + } + } + } + resolutions.push(panelResolution); + } + + // Filter out panels with the same resolution if onlyUniqueResolutions is true. + if (!onlyUniqueResolutions) { + return resolutions; + } + const uniqueResolutions: PanelResolutionStats[] = []; + for (const resolution of resolutions) { + let found = false; + for (const uniqueResolution of uniqueResolutions) { + if (arePanelsEquivalent(resolution, uniqueResolution)) { + found = true; + break; + } + } + if (!found) { + uniqueResolutions.push(resolution); + } + } + return uniqueResolutions; +} + +function determinePanelTypeAndUnit(panel: RenderedDataPanel) { + const isOrtographicProjection = + panel instanceof PerspectivePanel && + panel.viewer.orthographicProjection.value; + + const panelDimensionUnit = + panel instanceof SliceViewPanel || isOrtographicProjection ? "px" : "vh"; + let panelType: string; + if (panel instanceof SliceViewPanel) { + panelType = "Slice view (2D)"; + } else if (isOrtographicProjection) { + panelType = "Orthographic projection (3D)"; + } else if (panel instanceof PerspectivePanel) { + panelType = "Perspective projection (3D)"; + } else { + panelType = "Unknown"; + } + return { panelType, panelDimensionUnit }; +} + +/** + * Calculates the viewport bounds of the viewer render data panels individually. + * And also calculates the total viewport bounds of all the render data panels combined. + * + * The total bounds can contain some non-panel areas, such as the layer bar if + * the panels have been duplicated so that the layer bar sits in the middle + * of the visible rendered panels. + */ +export function calculatePanelViewportBounds( + panels: ReadonlySet, +): CanvasSizeStatistics { + const viewportBounds = { + left: Number.POSITIVE_INFINITY, + right: Number.NEGATIVE_INFINITY, + top: Number.POSITIVE_INFINITY, + bottom: Number.NEGATIVE_INFINITY, + panelType: "All", + }; + const allPanelViewports: PanelViewport[] = []; + for (const panel of panels) { + if (!(panel instanceof RenderedDataPanel)) continue; + const viewport = panel.renderViewport; + const { width, height } = viewport; + const panelLeft = panel.canvasRelativeClippedLeft; + const panelTop = panel.canvasRelativeClippedTop; + const panelRight = panelLeft + width; + const panelBottom = panelTop + height; + viewportBounds.left = Math.floor(Math.min(viewportBounds.left, panelLeft)); + viewportBounds.right = Math.ceil( + Math.max(viewportBounds.right, panelRight), + ); + viewportBounds.top = Math.ceil(Math.min(viewportBounds.top, panelTop)); + viewportBounds.bottom = Math.floor( + Math.max(viewportBounds.bottom, panelBottom), + ); + + allPanelViewports.push({ + left: panelLeft, + right: panelRight, + top: panelTop, + bottom: panelBottom, + panelType: determinePanelTypeAndUnit(panel).panelType, + }); + } + return { + totalRenderPanelViewport: viewportBounds, + individualRenderPanelViewports: allPanelViewports, + }; +} + +/** + * Combine the resolution of all dimensions into a single string for UI display + */ +function formatPhysicalResolution(resolution: DimensionResolutionStats[]) { + if (resolution.length === 0) return null; + const firstResolution = resolution[0]; + // If the resolution is the same for all dimensions, display it as a single line + if (firstResolution.dimensionName === "All_") { + return { + type: firstResolution.panelType, + resolution: firstResolution.resolutionWithUnit, + }; + } else { + const resolutionText = resolution + .map((res) => `${res.dimensionName} ${res.resolutionWithUnit}`) + .join(" "); + return { + type: firstResolution.panelType, + resolution: resolutionText, + }; + } +} + +function formatPixelResolution(panelArea: PanelViewport) { + const width = Math.round(panelArea.right - panelArea.left); + const height = Math.round(panelArea.bottom - panelArea.top); + const type = panelArea.panelType; + return { width, height, type }; +} + +/** + * Convenience function to extract resolution metadata from the viewer. + * Returns the resolution of the viewer layers and panels. + * The resolution is displayed in the following format: + * For panel resolution: + * Panel type, width, height, resolution + * For layer resolution: + * Layer name, layer type, resolution + */ +export function getViewerResolutionMetadata( + viewer: Viewer, +): ResolutionMetadata { + // Process the panel resolution table + const panelResolution = getViewerPanelResolutions(viewer.display.panels); + const panelResolutionData: PanelResolutionData[] = []; + for (const resolution of panelResolution) { + const physicalResolution = formatPhysicalResolution( + resolution.physicalResolution, + ); + if (physicalResolution === null) { + continue; + } + const pixelResolution = formatPixelResolution(resolution.pixelResolution); + panelResolutionData.push({ + type: physicalResolution.type, + width: pixelResolution.width, + height: pixelResolution.height, + resolution: physicalResolution.resolution, + }); + } + + // Process the layer resolution table + const layerResolution = getViewerLayerResolutions(viewer); + const layerResolutionData: LayerResolutionData[] = []; + for (const [key, value] of layerResolution) { + const { name, type } = key; + if (type === "MultiscaleMeshLayer") { + continue; + } + const physicalResolution = formatPhysicalResolution(value); + if (physicalResolution === null) { + continue; + } + layerResolutionData.push({ + name, + type, + resolution: physicalResolution.resolution, + }); + } + + return { panelResolutionData, layerResolutionData }; +} diff --git a/src/util/zorder.spec.ts b/src/util/zorder.spec.ts index 16486518c5..c5d5b810b1 100644 --- a/src/util/zorder.spec.ts +++ b/src/util/zorder.spec.ts @@ -15,14 +15,13 @@ */ import { describe, it, expect } from "vitest"; -import { Uint64 } from "#src/util/uint64.js"; import { decodeZIndexCompressed, zorder3LessThan } from "#src/util/zorder.js"; describe("decodeZIndexCompressed", () => { it("works for repetitive pattern 21,21,21", () => { expect( decodeZIndexCompressed( - Uint64.parseString("111000100010001111000100010001111000100010001", 2), + 0b111000100010001111000100010001111000100010001n, 21, 21, 21, @@ -35,10 +34,7 @@ describe("decodeZIndexCompressed", () => { it("works for repetitive pattern 18,15,17", () => { expect( decodeZIndexCompressed( - Uint64.parseString( - "11101111000100010001111000100010001111000100010001", - 2, - ), + 0b11101111000100010001111000100010001111000100010001n, 18, 15, 17, diff --git a/src/util/zorder.ts b/src/util/zorder.ts index 7f8bb9dd5a..323646305b 100644 --- a/src/util/zorder.ts +++ b/src/util/zorder.ts @@ -15,7 +15,6 @@ */ import type { TypedArray } from "#src/util/array.js"; -import type { Uint64 } from "#src/util/uint64.js"; export function getOctreeChildIndex(x: number, y: number, z: number) { return (x & 1) | ((y << 1) & 2) | ((z << 2) & 4); @@ -29,73 +28,46 @@ export function getOctreeChildIndex(x: number, y: number, z: number) { * respectively, for `i` in `[0, xBits)`, `[0, yBits)`, `[0, zBits)`, respectively. */ export function decodeZIndexCompressed( - zindex: Uint64, + zindex: bigint, xBits: number, yBits: number, zBits: number, ): Uint32Array { const maxCoordBits = Math.max(xBits, yBits, zBits); let inputBit = 0; - let inputValue = zindex.low; let x = 0; let y = 0; let z = 0; for (let coordBit = 0; coordBit < maxCoordBits; ++coordBit) { if (coordBit < xBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); x |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } if (coordBit < yBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); y |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } if (coordBit < zBits) { - const bit = (inputValue >>> inputBit) & 1; + const bit = Number((zindex >> BigInt(inputBit++)) & BigInt(1)); z |= bit << coordBit; - if (inputBit === 31) { - inputBit = 0; - inputValue = zindex.high; - } else { - ++inputBit; - } } } return Uint32Array.of(x, y, z); } export function encodeZIndexCompressed3d( - zindex: Uint64, xBits: number, yBits: number, zBits: number, x: number, y: number, z: number, -): Uint64 { +): bigint { const maxBits = Math.max(xBits, yBits, zBits); let outputBit = 0; - let outputNum = 0; - let isHigh = false; + let zIndex = 0n; function writeBit(b: number): void { - outputNum |= (b & 1) << outputBit; - if (++outputBit === 32) { - zindex.low = outputNum >>> 0; - outputNum = 0; - outputBit = 0; - isHigh = true; - } + zIndex |= BigInt(b) << BigInt(outputBit++); } for (let bit = 0; bit < maxBits; ++bit) { if (bit < xBits) { @@ -108,32 +80,18 @@ export function encodeZIndexCompressed3d( writeBit((z >> bit) & 1); } } - if (isHigh) { - zindex.high = outputNum >>> 0; - } else { - zindex.high = 0; - zindex.low = outputNum >>> 0; - } - return zindex; + return zIndex; } export function encodeZIndexCompressed( - zindex: Uint64, position: TypedArray, shape: TypedArray, -): Uint64 { +): bigint { + let zIndex = 0n; let outputBit = 0; const rank = position.length; - let outputNum = 0; - let isHigh = false; function writeBit(b: number): void { - outputNum |= (b & 1) << outputBit; - if (++outputBit === 32) { - zindex.low = outputNum >>> 0; - outputNum = 0; - outputBit = 0; - isHigh = true; - } + zIndex |= BigInt(b & 1) << BigInt(outputBit++); } for (let bit = 0; bit < 32; ++bit) { @@ -143,13 +101,7 @@ export function encodeZIndexCompressed( } } } - if (isHigh) { - zindex.high = outputNum >>> 0; - } else { - zindex.high = 0; - zindex.low = outputNum >>> 0; - } - return zindex; + return zIndex; } function lessMsb(a: number, b: number) { diff --git a/src/viewer.ts b/src/viewer.ts index 73a72f171a..a5a7519cd9 100644 --- a/src/viewer.ts +++ b/src/viewer.ts @@ -17,25 +17,23 @@ import "#src/viewer.css"; import "#src/ui/layer_data_sources_tab.js"; import "#src/noselect.css"; +import svg_camera from "ikonate/icons/camera.svg?raw"; import svg_controls_alt from "ikonate/icons/controls-alt.svg?raw"; import svg_layers from "ikonate/icons/layers.svg?raw"; import svg_list from "ikonate/icons/list.svg?raw"; import svg_settings from "ikonate/icons/settings.svg?raw"; import { debounce } from "lodash-es"; -import type { FrameNumberCounter } from "#src/chunk_manager/frontend.js"; -import { - CapacitySpecification, - ChunkManager, - ChunkQueueManager, -} from "#src/chunk_manager/frontend.js"; import { makeCoordinateSpace, TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; -import { defaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { getDefaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import type { CredentialsManager } from "#src/credentials_provider/index.js"; +import { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { DataManagementContext } from "#src/data_management_context.js"; import { InputEventBindings as DataPanelInputEventBindings } from "#src/data_panel_layout.js"; import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; -import type { DataSourceProviderRegistry } from "#src/datasource/index.js"; +import type { DataSourceRegistry } from "#src/datasource/index.js"; import { StateShare, stateShareEnabled } from "#src/datasource/state_share.js"; import type { DisplayContext } from "#src/display_context.js"; import { TrackableWindowedViewport } from "#src/display_context.js"; @@ -43,6 +41,7 @@ import { HelpPanelState, InputEventBindingHelpDialog, } from "#src/help/input_event_bindings.js"; +import { SharedKvStoreContext } from "#src/kvstore/frontend.js"; import { addNewLayer, LayerManager, @@ -70,6 +69,7 @@ import { WatchableDisplayDimensionRenderInfo, } from "#src/navigation_state.js"; import { overlaysOpen } from "#src/overlay.js"; +import { ScreenshotHandler } from "#src/python_integration/screenshots.js"; import { allRenderLayerRoles, RenderLayerRole } from "#src/renderlayer.js"; import { StatusMessage } from "#src/status.js"; import { @@ -89,11 +89,17 @@ import { } from "#src/ui/layer_list_panel.js"; import { LayerSidePanelManager } from "#src/ui/layer_side_panel.js"; import { setupPositionDropHandlers } from "#src/ui/position_drag_and_drop.js"; +import { ScreenshotDialog } from "#src/ui/screenshot_menu.js"; import { SelectionDetailsPanel } from "#src/ui/selection_details.js"; import { SidePanelManager } from "#src/ui/side_panel.js"; import { StateEditorDialog } from "#src/ui/state_editor.js"; import { StatisticsDisplayState, StatisticsPanel } from "#src/ui/statistics.js"; import { GlobalToolBinder, LocalToolBinder } from "#src/ui/tool.js"; +import { + MultiToolPaletteDropdownButton, + MultiToolPaletteManager, + MultiToolPaletteState, +} from "#src/ui/tool_palette.js"; import { ViewerSettingsPanel, ViewerSettingsPanelState, @@ -117,6 +123,7 @@ import { EventActionMap, KeyboardEventBinder, } from "#src/util/keyboard_bindings.js"; +import { ScreenshotManager } from "#src/util/screenshot_manager.js"; import { NullarySignal } from "#src/util/signal.js"; import { CompoundTrackable, @@ -127,7 +134,6 @@ import type { VisibilityPrioritySpecification, } from "#src/viewer_state.js"; import { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import type { GL } from "#src/webgl/context.js"; import { AnnotationToolStatusWidget } from "#src/widget/annotation_tool_status.js"; import { CheckboxIcon } from "#src/widget/checkbox_icon.js"; import { makeIcon } from "#src/widget/icon.js"; @@ -139,7 +145,6 @@ import { registerDimensionToolForViewer, } from "#src/widget/position_widget.js"; import { TrackableScaleBarOptions } from "#src/widget/scale_bar.js"; -import { RPC } from "#src/worker_rpc.js"; declare let NEUROGLANCER_OVERRIDE_DEFAULT_VIEWER_OPTIONS: any; @@ -150,60 +155,6 @@ interface CreditLink { declare let NEUROGLANCER_CREDIT_LINK: CreditLink | CreditLink[] | undefined; -export class DataManagementContext extends RefCounted { - worker: Worker; - chunkQueueManager: ChunkQueueManager; - chunkManager: ChunkManager; - - get rpc(): RPC { - return this.chunkQueueManager.rpc!; - } - - constructor( - public gl: GL, - public frameNumberCounter: FrameNumberCounter, - ) { - super(); - // Note: For compatibility with multiple bundlers, a browser-compatible URL - // must be used with `new URL`, which means a Node.js subpath import like - // "#src/chunk_worker.bundle.js" cannot be used. - this.worker = new Worker( - /* webpackChunkName: "neuroglancer_chunk_worker" */ - new URL("./chunk_worker.bundle.js", import.meta.url), - { type: "module" }, - ); - this.chunkQueueManager = this.registerDisposer( - new ChunkQueueManager( - new RPC(this.worker, /*waitUntilReady=*/ true), - this.gl, - this.frameNumberCounter, - { - gpuMemory: new CapacitySpecification({ - defaultItemLimit: 1e6, - defaultSizeLimit: 1e9, - }), - systemMemory: new CapacitySpecification({ - defaultItemLimit: 1e7, - defaultSizeLimit: 2e9, - }), - download: new CapacitySpecification({ - defaultItemLimit: 100, - defaultSizeLimit: Number.POSITIVE_INFINITY, - }), - compute: new CapacitySpecification({ - defaultItemLimit: 128, - defaultSizeLimit: 5e8, - }), - }, - ), - ); - this.chunkQueueManager.registerDisposer(() => this.worker.terminate()); - this.chunkManager = this.registerDisposer( - new ChunkManager(this.chunkQueueManager), - ); - } -} - export class InputEventBindings extends DataPanelInputEventBindings { global = new EventActionMap(); } @@ -212,6 +163,7 @@ export const VIEWER_TOP_ROW_CONFIG_OPTIONS = [ "showHelpButton", "showSettingsButton", "showEditStateButton", + "showToolPaletteButton", "showLayerListPanelButton", "showSelectionPanelButton", "showLayerSidePanelButton", @@ -262,7 +214,8 @@ export interface ViewerOptions VisibilityPrioritySpecification { dataContext: Owned; element: HTMLElement; - dataSourceProvider: Borrowed; + credentialsManager: CredentialsManager; + dataSourceProvider: Borrowed; uiConfiguration: ViewerUIConfiguration; showLayerDialog: boolean; inputEventBindings: InputEventBindings; @@ -328,6 +281,7 @@ class TrackableViewerState extends CompoundTrackable { this.add("partialViewport", viewer.partialViewport); this.add("selectedStateServer", viewer.selectedStateServer); this.add("toolBindings", viewer.toolBinder); + this.add("toolPalettes", viewer.toolPalettes); } restoreState(obj: any) { @@ -487,6 +441,9 @@ export class Viewer extends RefCounted implements ViewerState { resetInitiated = new NullarySignal(); + screenshotHandler: ScreenshotHandler; + screenshotManager: ScreenshotManager; + get chunkManager() { return this.dataContext.chunkManager; } @@ -504,7 +461,7 @@ export class Viewer extends RefCounted implements ViewerState { visibility: WatchableVisibilityPriority; inputEventBindings: InputEventBindings; element: HTMLElement; - dataSourceProvider: Borrowed; + dataSourceProvider: Borrowed; uiConfiguration: ViewerUIConfiguration; @@ -537,7 +494,8 @@ export class Viewer extends RefCounted implements ViewerState { options: Partial = {}, ) { super(); - + this.screenshotHandler = this.registerDisposer(new ScreenshotHandler(this)); + this.screenshotManager = this.registerDisposer(new ScreenshotManager(this)); const { dataContext = new DataManagementContext(display.gl, display), visibility = new WatchableVisibilityPriority( @@ -549,14 +507,29 @@ export class Viewer extends RefCounted implements ViewerState { perspectiveView: new EventActionMap(), }, element = display.makeCanvasOverlayElement(), - dataSourceProvider = getDefaultDataSourceProvider({ - credentialsManager: defaultCredentialsManager, - }), + uiConfiguration = makeViewerUIConfiguration(), + dataSourceProvider = (() => { + const { credentialsManager = getDefaultCredentialsManager() } = options; + const sharedCredentialsManager = this.registerDisposer( + new SharedCredentialsManager(credentialsManager, dataContext.rpc), + ); + const kvStoreContext = this.registerDisposer( + new SharedKvStoreContext( + dataContext.chunkManager, + sharedCredentialsManager, + ), + ); + return getDefaultDataSourceProvider({ + credentialsManager: sharedCredentialsManager, + kvStoreContext, + }); + })(), } = options; this.visibility = visibility; this.inputEventBindings = inputEventBindings; this.element = element; + this.dataSourceProvider = dataSourceProvider; this.uiConfiguration = uiConfiguration; @@ -632,6 +605,7 @@ export class Viewer extends RefCounted implements ViewerState { this.navigationState.reset(); this.perspectiveNavigationState.pose.orientation.reset(); this.perspectiveNavigationState.zoomFactor.reset(); + this.layout.restoreState("4panel-alt"); this.resetInitiated.dispatch(); if ( !overlaysOpen && @@ -768,6 +742,20 @@ export class Viewer extends RefCounted implements ViewerState { topRow.appendChild(stateShare.element); } + { + const button = this.registerDisposer( + new MultiToolPaletteDropdownButton(this.toolPalettes), + ).element; + + this.registerDisposer( + new ElementVisibilityFromTrackableBoolean( + this.uiControlVisibility.showToolPaletteButton, + button, + ), + ); + topRow.appendChild(button); + } + { const { layerListPanelState } = this; const button = this.registerDisposer( @@ -855,6 +843,14 @@ export class Viewer extends RefCounted implements ViewerState { topRow.appendChild(button); } + { + const button = makeIcon({ svg: svg_camera, title: "Screenshot" }); + this.registerEventListener(button, "click", () => { + this.showScreenshotDialog(); + }); + topRow.appendChild(button); + } + { const { helpPanelState } = this; const button = this.registerDisposer( @@ -907,6 +903,7 @@ export class Viewer extends RefCounted implements ViewerState { gridContainer.appendChild(topRow); + // Note: for new states, the actual default layout is 4panel-alt. this.layout = this.registerDisposer( new RootLayoutContainer(this, "4panel"), ); @@ -988,6 +985,10 @@ export class Viewer extends RefCounted implements ViewerState { }), ); + this.registerDisposer( + new MultiToolPaletteManager(this.sidePanelManager, this.toolPalettes), + ); + const updateVisibility = () => { const shouldBeVisible = this.visibility.visible; if (shouldBeVisible !== this.visible) { @@ -1119,8 +1120,10 @@ export class Viewer extends RefCounted implements ViewerState { ); }; - private globalToolBinder = this.registerDisposer( - new GlobalToolBinder(this.toolInputEventMapBinder), + public toolPalettes = new MultiToolPaletteState(this); + + public globalToolBinder = this.registerDisposer( + new GlobalToolBinder(this.toolInputEventMapBinder, this.toolPalettes), ); public toolBinder = this.registerDisposer( @@ -1131,10 +1134,20 @@ export class Viewer extends RefCounted implements ViewerState { this.globalToolBinder.activate(uppercase); } + deactivateTools() { + this.globalToolBinder.deactivate(); + } + editJsonState() { + this.deactivateTools(); new StateEditorDialog(this); } + showScreenshotDialog() { + this.deactivateTools(); + new ScreenshotDialog(this.screenshotManager); + } + showStatistics(value: boolean | undefined = undefined) { if (value === undefined) { value = !this.statisticsDisplayState.location.visible; diff --git a/src/volume_rendering/volume_render_layer.ts b/src/volume_rendering/volume_render_layer.ts index ee6064b678..106467339f 100644 --- a/src/volume_rendering/volume_render_layer.ts +++ b/src/volume_rendering/volume_render_layer.ts @@ -74,7 +74,7 @@ import { drawBoxes, glsl_getBoxFaceVertexPosition, } from "#src/webgl/bounding_box.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import { glsl_COLORMAPS } from "#src/webgl/colormaps.js"; import type { @@ -218,6 +218,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { chunkResolutionHistogram: RenderScaleHistogram; mode: TrackableVolumeRenderingModeValue; backend: ChunkRenderLayerFrontend; + highestResolutionLoadedVoxelSize: Float32Array | undefined; private modeOverride: TrackableVolumeRenderingModeValue; private vertexIdHelper: VertexIdHelper; private dataHistogramSpecifications: HistogramSpecifications; @@ -250,7 +251,7 @@ export class VolumeRenderingRenderLayer extends PerspectiveViewRenderLayer { return this.dataHistogramSpecifications.visibleHistograms; } - private histogramIndexBuffer: RefCountedValue; + private histogramIndexBuffer: RefCountedValue; constructor(options: VolumeRenderingRenderLayerOptions) { super(); @@ -878,6 +879,8 @@ outputValue = vec4(1.0, 1.0, 1.0, 1.0); curPhysicalSpacing = physicalSpacing; curOptimalSamples = optimalSamples; curHistogramInformation = histogramInformation; + this.highestResolutionLoadedVoxelSize = + transformedSource.effectiveVoxelSize; const chunkLayout = getNormalizedChunkLayout( projectionParameters, transformedSource.chunkLayout, diff --git a/src/webgl/buffer.ts b/src/webgl/buffer.ts index d976cde8de..bf4c18c64d 100644 --- a/src/webgl/buffer.ts +++ b/src/webgl/buffer.ts @@ -24,7 +24,7 @@ import type { AttributeIndex } from "#src/webgl/shader.js"; export type BufferType = number; export type WebGLDataType = number; export type WebGLBufferUsage = number; -export class Buffer implements Disposable { +export class GLBuffer implements Disposable { buffer: WebGLBuffer | null; constructor( public gl: WebGL2RenderingContext, @@ -98,7 +98,7 @@ export class Buffer implements Disposable { bufferType?: BufferType, usage?: WebGLBufferUsage, ) { - const buffer = new Buffer(gl, bufferType); + const buffer = new GLBuffer(gl, bufferType); buffer.setData(data, usage); return buffer; } @@ -118,7 +118,7 @@ export function getMemoizedBuffer( }), () => { const result = new RefCountedValue( - Buffer.fromData( + GLBuffer.fromData( gl, getter(...args), bufferType, diff --git a/src/webgl/context.ts b/src/webgl/context.ts index 5241781a6e..3da15d46e2 100644 --- a/src/webgl/context.ts +++ b/src/webgl/context.ts @@ -41,9 +41,13 @@ export function initializeWebGL(canvas: HTMLCanvasElement) { throw new Error("WebGL not supported."); } gl.memoize = new Memoize(); - gl.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - gl.max3dTextureSize = gl.getParameter(gl.MAX_3D_TEXTURE_SIZE); - gl.maxTextureImageUnits = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS); + gl.maxTextureSize = gl.getParameter(WebGL2RenderingContext.MAX_TEXTURE_SIZE); + gl.max3dTextureSize = gl.getParameter( + WebGL2RenderingContext.MAX_3D_TEXTURE_SIZE, + ); + gl.maxTextureImageUnits = gl.getParameter( + WebGL2RenderingContext.MAX_TEXTURE_IMAGE_UNITS, + ); gl.tempTextureUnit = gl.maxTextureImageUnits - 1; // FIXME: verify that we received a stencil buffer diff --git a/src/webgl/empirical_cdf.ts b/src/webgl/empirical_cdf.ts index 71c35148ed..ebd5ffac08 100644 --- a/src/webgl/empirical_cdf.ts +++ b/src/webgl/empirical_cdf.ts @@ -105,24 +105,30 @@ const histogramSamples = 2 ** 14; * Generates a histogram from a single-channel uint8 texture. */ export class TextureHistogramGenerator extends RefCounted { - private shader = this.registerDisposer( - (() => { - const builder = new ShaderBuilder(this.gl); - builder.addOutputBuffer("vec4", "outputValue", 0); - builder.addAttribute("float", "aInput1"); - builder.addTextureSampler( - "sampler2D", - "uDataSampler", - histogramDataSamplerTextureUnit, - ); - builder.addTextureSampler( - "sampler2D", - "uDepthSampler", - histogramDepthTextureUnit, - ); - // builder.addUniform('float', 'uRandomSeed'); - builder.addVertexCode(glsl_simpleFloatHash); - builder.setVertexMain(` + private shader; + private inputIndexBuffer; + + constructor(public gl: GL) { + super(); + + this.shader = this.registerDisposer( + (() => { + const builder = new ShaderBuilder(this.gl); + builder.addOutputBuffer("vec4", "outputValue", 0); + builder.addAttribute("float", "aInput1"); + builder.addTextureSampler( + "sampler2D", + "uDataSampler", + histogramDataSamplerTextureUnit, + ); + builder.addTextureSampler( + "sampler2D", + "uDepthSampler", + histogramDepthTextureUnit, + ); + // builder.addUniform('float', 'uRandomSeed'); + builder.addVertexCode(glsl_simpleFloatHash); + builder.setVertexMain(` float uRandomSeed = 0.0; vec2 p = vec2(simpleFloatHash(vec2(aInput1 + float(gl_VertexID), uRandomSeed + float(gl_InstanceID))), simpleFloatHash(vec2(aInput1 + float(gl_VertexID) + 10.0, 5.0 + uRandomSeed + float(gl_InstanceID)))); @@ -135,23 +141,20 @@ if (stencilValue == 1.0) { } gl_PointSize = 1.0; `); - builder.setFragmentMain(` + builder.setFragmentMain(` outputValue = vec4(1.0, 1.0, 1.0, 1.0); `); - return builder.build(); - })(), - ); - - private inputIndexBuffer = this.registerDisposer( - getMemoizedBuffer( - this.gl, - WebGL2RenderingContext.ARRAY_BUFFER, - () => new Uint8Array(histogramSamplesPerInstance), - ), - ); + return builder.build(); + })(), + ); - constructor(public gl: GL) { - super(); + this.inputIndexBuffer = this.registerDisposer( + getMemoizedBuffer( + this.gl, + WebGL2RenderingContext.ARRAY_BUFFER, + () => new Uint8Array(histogramSamplesPerInstance), + ), + ); } static get(gl: GL) { diff --git a/src/webgl/index_emulation.ts b/src/webgl/index_emulation.ts index c1976599f6..c804937d53 100644 --- a/src/webgl/index_emulation.ts +++ b/src/webgl/index_emulation.ts @@ -15,7 +15,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; import { glsl_uint32 } from "#src/webgl/shader_lib.js"; @@ -23,11 +23,11 @@ import { glsl_uint32 } from "#src/webgl/shader_lib.js"; export class CountingBuffer extends RefCounted { length: number | undefined; webglType: number | undefined; - buffer: Buffer; + buffer: GLBuffer; constructor(public gl: GL) { super(); - this.buffer = this.registerDisposer(new Buffer(gl)); + this.buffer = this.registerDisposer(new GLBuffer(gl)); } resize(length: number) { @@ -115,7 +115,7 @@ export class IndexBufferAttributeHelper { builder.addAttribute("highp uint", this.name); } - bind(buffer: Buffer, shader: ShaderProgram) { + bind(buffer: GLBuffer, shader: ShaderProgram) { const attrib = shader.attribute(this.name); buffer.bindToVertexAttribI( attrib, @@ -130,7 +130,7 @@ export class IndexBufferAttributeHelper { } export function makeIndexBuffer(gl: WebGL2RenderingContext, data: Uint32Array) { - return Buffer.fromData( + return GLBuffer.fromData( gl, data, WebGL2RenderingContext.ARRAY_BUFFER, diff --git a/src/webgl/lerp.browser_test.ts b/src/webgl/lerp.browser_test.ts index c700d6761e..e925609bd5 100644 --- a/src/webgl/lerp.browser_test.ts +++ b/src/webgl/lerp.browser_test.ts @@ -15,6 +15,7 @@ */ import { expect, describe, it } from "vitest"; +import type { TypedArrayConstructor } from "#src/util/array.js"; import { DATA_TYPE_ARRAY_CONSTRUCTOR, DataType } from "#src/util/data_type.js"; import type { DataTypeInterval } from "#src/util/lerp.js"; import { @@ -39,7 +40,9 @@ function getRandomValue(dataType: DataType) { case DataType.INT16: case DataType.UINT32: case DataType.INT32: { - const buf = new DATA_TYPE_ARRAY_CONSTRUCTOR[dataType](1); + const buf = new (DATA_TYPE_ARRAY_CONSTRUCTOR[ + dataType + ] as TypedArrayConstructor)(1); getRandomValues(buf); return buf[0]; } diff --git a/src/webgl/offscreen.ts b/src/webgl/offscreen.ts index 12754a55c2..0a9e3f2bd1 100644 --- a/src/webgl/offscreen.ts +++ b/src/webgl/offscreen.ts @@ -110,9 +110,10 @@ export class DepthStencilRenderbuffer extends DepthRenderbuffer { export const StencilRenderbuffer = DepthStencilRenderbuffer; export class Framebuffer extends RefCounted { - framebuffer = this.gl.createFramebuffer(); + framebuffer; constructor(public gl: GL) { super(); + this.framebuffer = gl.createFramebuffer(); } disposed() { const { gl } = this; @@ -219,7 +220,7 @@ export class FramebufferConfiguration< depthBuffer: DepthBuffer | undefined; fullAttachmentList = new Array(); private attachmentVerified = false; - singleAttachmentList = [this.gl.COLOR_ATTACHMENT0]; + singleAttachmentList = [WebGL2RenderingContext.COLOR_ATTACHMENT0]; constructor( public gl: GL, @@ -352,9 +353,11 @@ export class OffscreenCopyHelper extends RefCounted { ) { super(); this.registerDisposer(shader); + this.copyVertexPositionsBuffer = getSquareCornersBuffer(gl); + this.copyTexCoordsBuffer = getSquareCornersBuffer(gl, 0, 0, 1, 1); } - private copyVertexPositionsBuffer = getSquareCornersBuffer(this.gl); - private copyTexCoordsBuffer = getSquareCornersBuffer(this.gl, 0, 0, 1, 1); + private copyVertexPositionsBuffer; + private copyTexCoordsBuffer; draw(...textures: (WebGLTexture | null)[]) { const { gl, shader } = this; diff --git a/src/webgl/shader.ts b/src/webgl/shader.ts index f87187c46b..ed2f4220db 100644 --- a/src/webgl/shader.ts +++ b/src/webgl/shader.ts @@ -186,12 +186,12 @@ export class ShaderProgram extends RefCounted { const vertexShader = (this.vertexShader = getShader( gl, vertexSource, - gl.VERTEX_SHADER, + WebGL2RenderingContext.VERTEX_SHADER, )); const fragmentShader = (this.fragmentShader = getShader( gl, fragmentSource, - gl.FRAGMENT_SHADER, + WebGL2RenderingContext.FRAGMENT_SHADER, )); const shaderProgram = gl.createProgram()!; diff --git a/src/webgl/shader_testing.ts b/src/webgl/shader_testing.ts index b65104a0cb..407f3b8cd7 100644 --- a/src/webgl/shader_testing.ts +++ b/src/webgl/shader_testing.ts @@ -117,10 +117,10 @@ export class FragmentShaderTester< Inputs extends FragmentShaderTestOutputs, Outputs extends FragmentShaderTestOutputs, > extends RefCounted { - builder = new ShaderBuilder(this.gl); + builder: ShaderBuilder; private shader_: ShaderProgram; offscreenFramebuffer: FramebufferConfiguration; - private vertexPositionsBuffer = getSquareCornersBuffer(this.gl, -1, -1, 1, 1); + private vertexPositionsBuffer; constructor( public gl: GL, @@ -128,8 +128,10 @@ export class FragmentShaderTester< public outputs: Outputs, ) { super(); - const { builder } = this; - this.offscreenFramebuffer = new FramebufferConfiguration(this.gl, { + const builder = (this.builder = new ShaderBuilder(gl)); + this.vertexPositionsBuffer = getSquareCornersBuffer(gl, -1, -1, 1, 1); + + this.offscreenFramebuffer = new FramebufferConfiguration(gl, { colorBuffers: makeTextureBuffersForOutputs(gl, outputs), }); builder.addAttribute("vec4", "shader_testing_aVertexPosition"); diff --git a/src/webgl/spheres.ts b/src/webgl/spheres.ts index e42e6790e2..e9a899a850 100644 --- a/src/webgl/spheres.ts +++ b/src/webgl/spheres.ts @@ -19,7 +19,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import type { Buffer } from "#src/webgl/buffer.js"; +import type { GLBuffer } from "#src/webgl/buffer.js"; import { getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder, ShaderProgram } from "#src/webgl/shader.js"; @@ -71,8 +71,8 @@ export function getSphereIndexArray( } export class SphereRenderHelper extends RefCounted { - private vertexBuffer: Buffer; - private indexBuffer: Buffer; + private vertexBuffer: GLBuffer; + private indexBuffer: GLBuffer; private numIndices: number; constructor(gl: GL, latitudeBands: number, longitudeBands: number) { diff --git a/src/webgl/texture_access.ts b/src/webgl/texture_access.ts index 82e225e999..a06061ef3f 100644 --- a/src/webgl/texture_access.ts +++ b/src/webgl/texture_access.ts @@ -495,8 +495,10 @@ ${shaderType} ${functionName}(${indexType} index) { } export class OneDimensionalTextureAccessHelper { - readTextureValue = `readTextureValue_${this.key}`; - constructor(public key: string) {} + readTextureValue: string; + constructor(public key: string) { + this.readTextureValue = `readTextureValue_${key}`; + } defineShader(builder: ShaderBuilder) { builder; } @@ -549,11 +551,13 @@ void ${this.readTextureValue}(highp ${samplerPrefix}sampler2D sampler, highp uin } export class TextureAccessHelper { - readTextureValue = `readTextureValue_${this.key}`; + readTextureValue: string; constructor( public key: string, public textureDims: number, - ) {} + ) { + this.readTextureValue = `readTextureValue_${key}`; + } getReadTextureValueCode( texelsPerElement: number, samplerPrefix: ShaderSamplerPrefix, diff --git a/src/webgl/vertex_id.ts b/src/webgl/vertex_id.ts index 9f20345679..7ca492268a 100644 --- a/src/webgl/vertex_id.ts +++ b/src/webgl/vertex_id.ts @@ -22,7 +22,7 @@ */ import { RefCounted } from "#src/util/disposable.js"; -import { Buffer } from "#src/webgl/buffer.js"; +import { GLBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { ShaderBuilder } from "#src/webgl/shader.js"; @@ -40,11 +40,11 @@ int getVertexId () { export class VertexIdHelper extends RefCounted { size: number; - buffer: Buffer; + buffer: GLBuffer; constructor(gl: WebGL2RenderingContext) { super(); - this.buffer = new Buffer(gl); + this.buffer = new GLBuffer(gl); this.size = 0; } diff --git a/src/widget/channel_dimensions_widget.ts b/src/widget/channel_dimensions_widget.ts index 701f0b6a98..55ec155634 100644 --- a/src/widget/channel_dimensions_widget.ts +++ b/src/widget/channel_dimensions_widget.ts @@ -25,6 +25,7 @@ import { getDisplayLowerUpperBounds, insertDimensionAt, } from "#src/coordinate_transform.js"; +import type { WatchableValueInterface } from "#src/trackable_value.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import { arraysEqual } from "#src/util/array.js"; import { RefCounted } from "#src/util/disposable.js"; @@ -97,10 +98,11 @@ export class ChannelDimensionsWidget extends RefCounted { ); } - coordinateSpace = this.combiner.combined; + coordinateSpace: WatchableValueInterface; constructor(public combiner: CoordinateSpaceCombiner) { super(); + this.coordinateSpace = combiner.combined; const { element } = this; element.classList.add("neuroglancer-channel-dimensions-widget"); const debouncedUpdateView = this.registerCancellable( diff --git a/src/widget/invlerp.ts b/src/widget/invlerp.ts index 2543f49cfa..b56381eddc 100644 --- a/src/widget/invlerp.ts +++ b/src/widget/invlerp.ts @@ -347,20 +347,21 @@ class CdfPanel extends IndirectRenderedPanel { get drawOrder() { return 100; } - controller = this.registerDisposer( - new CdfController( - this.element, - this.parent.dataType, - () => this.parent.trackable.value, - (value: InvlerpParameters) => { - this.parent.trackable.value = value; - }, - ), - ); + controller; constructor(public parent: InvlerpWidget) { super(parent.display, document.createElement("div"), parent.visibility); const { element } = this; element.classList.add("neuroglancer-invlerp-cdfpanel"); + this.controller = this.registerDisposer( + new CdfController( + element, + parent.dataType, + () => parent.trackable.value, + (value: InvlerpParameters) => { + parent.trackable.value = value; + }, + ), + ); } private dataValuesBuffer = this.registerDisposer( @@ -730,10 +731,7 @@ export function adjustInvlerpBrightnessContrast( export class InvlerpWidget extends Tab { cdfPanel = this.registerDisposer(new CdfPanel(this)); - boundElements = { - range: createRangeBoundInputs("range", this.dataType, this.trackable), - window: createRangeBoundInputs("window", this.dataType, this.trackable), - }; + boundElements; invertArrows: HTMLElement[]; autoRangeFinder: AutoRangeFinder; get texture() { @@ -754,6 +752,11 @@ export class InvlerpWidget extends Tab { public legendShaderOptions: LegendShaderOptions | undefined, ) { super(visibility); + this.boundElements = { + range: createRangeBoundInputs("range", dataType, trackable), + window: createRangeBoundInputs("window", dataType, trackable), + }; + this.registerDisposer( histogramSpecifications.visibility.add(this.visibility), ); diff --git a/src/widget/layer_control.ts b/src/widget/layer_control.ts index d1c14a06f5..7497ee3006 100644 --- a/src/widget/layer_control.ts +++ b/src/widget/layer_control.ts @@ -100,6 +100,13 @@ function makeControl( visibility, }); controlElement.classList.add("neuroglancer-layer-control-control"); + + // Disable drag and drop on the control itself to avoid interference. + controlElement.draggable = true; + controlElement.addEventListener("dragstart", (event) => { + event.stopPropagation(); + event.preventDefault(); + }); controlContainer.appendChild(controlElement); return { controlContainer, @@ -119,7 +126,13 @@ export class LayerControlTool< ) { super(layer); } + + isLoading() { + return false; + } + activate(activation: ToolActivation) { + if (this.isLoading()) return; const { options } = this; const { layer } = this; const { isValid } = options; @@ -136,6 +149,19 @@ export class LayerControlTool< body.appendChild(controlContainer); options.activateTool(activation, control); } + renderInPalette(context: RefCounted) { + if (this.isLoading()) return undefined; + const { controlContainer } = makeControl( + context, + this.layer, + this.options, + new WatchableVisibilityPriority(WatchableVisibilityPriority.VISIBLE), + ); + controlContainer.classList.add( + "neuroglancer-layer-options-control-container", + ); + return controlContainer; + } get description() { const { options } = this; return options.toolDescription ?? options.label; @@ -162,7 +188,11 @@ function makeLayerControlToOptionsTab( ); label.prepend( context.registerDisposer( - new ToolBindingWidget(layer.toolBinder, options.toolJson), + new ToolBindingWidget( + layer.toolBinder, + options.toolJson, + controlContainer, + ), ).element, ); return controlContainer; @@ -202,5 +232,15 @@ export function registerLayerControl( layerType, toolId, (layer) => new LayerControlTool(layer, options), + (layer, onChange) => { + const isValid = options.isValid?.(layer); + if (isValid !== undefined && onChange !== undefined) { + isValid.changed.addOnce(onChange); + } + if (options.isValid?.(layer).value === false) { + return []; + } + return [{ type: toolId }]; + }, ); } diff --git a/src/widget/layer_type_indicator.css b/src/widget/layer_type_indicator.css new file mode 100644 index 0000000000..14e50b180b --- /dev/null +++ b/src/widget/layer_type_indicator.css @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.neuroglancer-layer-type-indicator { + display: flex; + align-items: center; + padding: 2px; + background-color: rgba(255, 255, 255, 0.2); + border-radius: 4px; + color: #fff; + font-size: 10pt; + font-weight: 700; + font-family: sans-serif; + line-height: normal; + height: 1rem; + justify-content: center; + width: 26px; +} diff --git a/src/widget/layer_type_indicator.ts b/src/widget/layer_type_indicator.ts new file mode 100644 index 0000000000..e139972164 --- /dev/null +++ b/src/widget/layer_type_indicator.ts @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/widget/layer_type_indicator.css"; +import { layerTypes, type ManagedUserLayer } from "#src/layer/index.js"; +import { RefCounted } from "#src/util/disposable.js"; + +function capitalizeFirstLetter(type: string): string { + return type ? type[0].toUpperCase() + type.slice(1) : ""; +} + +export class LayerTypeIndicatorWidget extends RefCounted { + element = document.createElement("div"); + constructor(public layer: ManagedUserLayer) { + super(); + this.element.classList.add("neuroglancer-layer-type-indicator"); + this.registerDisposer(layer.layerChanged.add(() => this.updateView())); + this.updateView(); + } + updateView() { + const layerType = this.layer.layer?.type ?? "unknown"; + this.element.textContent = + layerTypes.get(layerType)?.typeAbbreviation ?? "—"; + this.element.title = `${capitalizeFirstLetter(layerType)} layer (modifiable in the layer settings)`; + } +} diff --git a/src/widget/multiline_autocomplete.css b/src/widget/multiline_autocomplete.css index 8ff86179fd..86ad6b91ae 100644 --- a/src/widget/multiline_autocomplete.css +++ b/src/widget/multiline_autocomplete.css @@ -48,8 +48,9 @@ font-size: medium; } -.neuroglancer-multiline-autocomplete-dropdown { - color: #fff; +.neuroglancer-multiline-autocomplete-dropdown, +.neuroglancer-multiline-autocomplete-error, +.neuroglancer-multiline-autocomplete-progress { background-color: #181818; position: fixed; display: block; @@ -67,6 +68,19 @@ word-wrap: break-word; } +.neuroglancer-multiline-autocomplete-dropdown { + color: #fff; +} + +.neuroglancer-multiline-autocomplete-error { + color: red; +} + +.neuroglancer-multiline-autocomplete-progress { + font-style: italic; + color: #ccc; +} + .neuroglancer-multiline-autocomplete-completion:nth-child(even):not( .neuroglancer-multiline-autocomplete-completion-active ) { @@ -88,3 +102,8 @@ font-style: italic; color: #f9f; } + +.neuroglancer-multiline-autocomplete-linebreak::after { + content: "\a"; + white-space: pre; +} diff --git a/src/widget/multiline_autocomplete.ts b/src/widget/multiline_autocomplete.ts index 4a3f8c5a60..31882e66e5 100644 --- a/src/widget/multiline_autocomplete.ts +++ b/src/widget/multiline_autocomplete.ts @@ -17,8 +17,6 @@ import "#src/widget/multiline_autocomplete.css"; import { debounce } from "lodash-es"; -import type { CancellationToken } from "#src/util/cancellation.js"; -import { CancellationTokenSource } from "#src/util/cancellation.js"; import type { BasicCompletionResult, Completion, @@ -27,13 +25,16 @@ import type { import { RefCounted } from "#src/util/disposable.js"; import { removeChildren, removeFromParent } from "#src/util/dom.js"; import { positionDropdown } from "#src/util/dropdown.js"; +import { formatErrorMessage } from "#src/util/error.js"; import { EventActionMap, KeyboardEventBinder, registerActionListener, } from "#src/util/keyboard_bindings.js"; import { longestCommonPrefix } from "#src/util/longest_common_prefix.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; import { Signal } from "#src/util/signal.js"; +import { ProgressListenerWidget } from "#src/widget/progress_listener.js"; import { VirtualList } from "#src/widget/virtual_list.js"; export type { @@ -58,19 +59,16 @@ export function makeDefaultCompletionElement(completion: Completion) { return element; } -function* splitByWordBreaks(value: string) { - while (value.length > 0) { - const m = value.match(/[:/_]+/); - if (m === null) { - yield value; - return; - } - const endOffset = m.index! + m[0].length; - yield value.substring(0, endOffset); - value = value.substring(endOffset); - } +export interface SyntaxHighlighter { + splitPattern: RegExp; + getSeparatorNode: (text: string) => HTMLElement; } +const DEFAULT_SYNTAX_HIGHLIGHTER: SyntaxHighlighter = { + splitPattern: /.*/gs, + getSeparatorNode: () => document.createElement("wbr"), +}; + export function makeCompletionElementWithDescription( completion: CompletionWithDescription, ) { @@ -96,9 +94,14 @@ const keyMap = EventActionMap.fromObject({ escape: { action: "cancel", preventDefault: false, stopPropagation: false }, }); +export interface CompletionRequest { + value: string; + selectionRange?: { begin: number; end: number } | undefined; +} export type Completer = ( - value: string, - cancellationToken: CancellationToken, + request: CompletionRequest, + signal: AbortSignal, + progressListener: ProgressListener, ) => Promise | null; const DEFAULT_COMPLETION_DELAY = 200; // milliseconds @@ -113,9 +116,11 @@ export class AutocompleteTextInput extends RefCounted { private prevInputValue: string | undefined = ""; private completionsVisible = false; private activeCompletionPromise: Promise | null = null; - private activeCompletionCancellationToken: - | CancellationTokenSource - | undefined = undefined; + private activeCompletionAbortController: AbortController | undefined = + undefined; + private activeCompletionProgressListener: ProgressListenerWidget | undefined = + undefined; + private completionErrorElement: HTMLElement | undefined; private hasFocus = false; private completionResult: CompletionResult | null = null; private dropdownContentsStale = true; @@ -160,14 +165,15 @@ export class AutocompleteTextInput extends RefCounted { ) { const completionDisabled = this.completionDisabled !== -1; this.onInput.dispatch(value); - const { inputElement } = this; + const { inputElement, syntaxHighlighter } = this; removeChildren(inputElement); let outputOffset = 0; const r = selection !== undefined ? document.createRange() : undefined; let isFirst = true; - for (const text of splitByWordBreaks(value)) { + for (const text of value.match(syntaxHighlighter.splitPattern)!) { + if (!text) continue; if (!isFirst) { - inputElement.appendChild(document.createElement("wbr")); + inputElement.appendChild(syntaxHighlighter.getSeparatorNode(text)); } isFirst = false; const newOutputOffset = outputOffset + text.length; @@ -215,30 +221,56 @@ export class AutocompleteTextInput extends RefCounted { completer: Completer; private resizeHandler = () => { - if (!this.completionsVisible) return; this.updateDropdownStyle(); }; private resizeObserver = new ResizeObserver(this.resizeHandler); - constructor(options: { completer: Completer; delay?: number }) { + private syntaxHighlighter: SyntaxHighlighter; + + constructor(options: { + completer: Completer; + syntaxHighlighter?: SyntaxHighlighter; + delay?: number; + }) { super(); this.completer = options.completer; - const { delay = DEFAULT_COMPLETION_DELAY } = options; + const { + delay = DEFAULT_COMPLETION_DELAY, + syntaxHighlighter = DEFAULT_SYNTAX_HIGHLIGHTER, + } = options; + this.syntaxHighlighter = syntaxHighlighter; const debouncedCompleter = (this.scheduleUpdateCompletions = debounce( () => { - const cancellationToken = (this.activeCompletionCancellationToken = - new CancellationTokenSource()); + const abortController = (this.activeCompletionAbortController = + new AbortController()); + const progressListener = this.makeCompletionProgressListener(); const activeCompletionPromise = (this.activeCompletionPromise = - this.completer(this.value, cancellationToken)); + this.completer( + { + value: this.value, + selectionRange: this.getSelectionRange(), + }, + abortController.signal, + progressListener, + )); if (activeCompletionPromise !== null) { - activeCompletionPromise.then((completionResult) => { - if (this.activeCompletionPromise === activeCompletionPromise) { - this.setCompletions(completionResult); - this.activeCompletionPromise = null; - } - }); + activeCompletionPromise.then( + (completionResult) => { + if (this.activeCompletionPromise === activeCompletionPromise) { + this.setCompletions(completionResult); + this.activeCompletionPromise = null; + this.removeProgressListener(); + } + }, + (reason) => { + if (this.activeCompletionPromise === activeCompletionPromise) { + this.removeProgressListener(); + this.showCompletionError(reason); + } + }, + ); } }, delay, @@ -256,9 +288,9 @@ export class AutocompleteTextInput extends RefCounted { inputElement.contentEditable = "true"; inputElement.spellcheck = false; - element.appendChild(document.createTextNode("\u200b")); // Prevent input area from collapsing element.appendChild(inputElement); element.appendChild(hintElement); + element.appendChild(document.createTextNode("\u200b")); // Prevent input area from collapsing inputElement.classList.add("neuroglancer-multiline-autocomplete-input"); hintElement.classList.add("neuroglancer-multiline-autocomplete-hint"); inputElement.addEventListener("input", () => { @@ -342,21 +374,32 @@ export class AutocompleteTextInput extends RefCounted { this.debouncedUpdateHintState(); } }); - this.registerEventListener(this.inputElement, "blur", () => { - if (this.hasFocus) { - if (DEBUG_DROPDOWN) return; - this.hasFocus = false; - this.updateDropdown(); - } - this.debouncedUpdateHintState(); - const s = window.getSelection(); - if (s !== null) { - if (s.containsNode(this.inputElement, true)) { - s.removeAllRanges(); + + // Debounce blur handling to avoid spuriously closing the completions. + const debouncedBlur = this.registerCancellable( + debounce(() => { + if (document.activeElement === this.inputElement) { + // Ignore spurious blur events, or blur events from the browser + // tab/window itself losing focus. + return; } - } - this.onCommit.dispatch(this.value, false); - }); + if (this.hasFocus) { + if (DEBUG_DROPDOWN) return; + this.hasFocus = false; + this.updateDropdown(); + } + this.debouncedUpdateHintState(); + const s = window.getSelection(); + if (s !== null) { + if (s.containsNode(this.inputElement, true)) { + s.removeAllRanges(); + } + } + this.onCommit.dispatch(this.value, false); + }), + ); + + this.registerEventListener(this.inputElement, "blur", debouncedBlur); this.registerEventListener(window, "resize", () => { this.dropdownStyleStale = true; }); @@ -414,6 +457,34 @@ export class AutocompleteTextInput extends RefCounted { }); } + private removeProgressListener() { + if (this.activeCompletionProgressListener !== undefined) { + this.element.removeChild(this.activeCompletionProgressListener.element); + this.activeCompletionProgressListener = undefined; + } + } + + private makeCompletionProgressListener(): ProgressListenerWidget { + const widget = new ProgressListenerWidget(); + this.element.appendChild(widget.element); + widget.element.classList.add( + "neuroglancer-multiline-autocomplete-progress", + ); + this.activeCompletionProgressListener = widget; + this.updateDropdownStyle(); + return widget; + } + + private showCompletionError(reason: unknown) { + if (reason === null) return; + const element = document.createElement("div"); + this.completionErrorElement = element; + element.classList.add("neuroglancer-multiline-autocomplete-error"); + element.textContent = formatErrorMessage(reason); + this.element.appendChild(element); + this.updateDropdownStyle(); + } + private shouldAttemptCompletion() { const { inputElement } = this; if (document.activeElement !== inputElement) return false; @@ -496,9 +567,12 @@ export class AutocompleteTextInput extends RefCounted { } private updateDropdownStyle() { - const { completionsVirtualList, element } = this; - if (completionsVirtualList !== undefined) { - positionDropdown(completionsVirtualList.element, element, { + const widget = + this.completionsVirtualList?.element ?? + this.activeCompletionProgressListener?.element ?? + this.completionErrorElement; + if (widget !== undefined) { + positionDropdown(widget, this.element, { horizontal: false, }); } @@ -603,13 +677,15 @@ export class AutocompleteTextInput extends RefCounted { } else { this.hasResultForDropdown = true; // Check for a common prefix. - const commonResultPrefix = longestCommonPrefix( - (function* () { - for (const completion of completionResult.completions) { - yield completion.value; - } - })(), - ); + const commonResultPrefix = + completionResult.defaultCompletion ?? + longestCommonPrefix( + (function* () { + for (const completion of completionResult.completions) { + yield completion.value; + } + })(), + ); const commonPrefix = this.getCompletedValue(commonResultPrefix); if (commonPrefix.startsWith(value)) { this.commonPrefix = commonPrefix; @@ -628,12 +704,13 @@ export class AutocompleteTextInput extends RefCounted { hintValue = ""; } hintValue = hintValue.substring(value.length); - const { hintElement } = this; + const { hintElement, syntaxHighlighter } = this; removeChildren(hintElement); let isFirst = true; - for (const text of splitByWordBreaks(hintValue)) { + for (const text of hintValue.match(syntaxHighlighter.splitPattern)!) { + if (!text) continue; if (!isFirst) { - hintElement.appendChild(document.createElement("wbr")); + hintElement.appendChild(syntaxHighlighter.getSeparatorNode(text)); } isFirst = false; const node = document.createTextNode(text); @@ -764,20 +841,18 @@ export class AutocompleteTextInput extends RefCounted { private cancelActiveCompletion() { this.prevInputValue = undefined; - const token = this.activeCompletionCancellationToken; - if (token !== undefined) { - token.cancel(); - } - this.activeCompletionCancellationToken = undefined; + this.activeCompletionAbortController?.abort(); + this.activeCompletionAbortController = undefined; this.activeCompletionPromise = null; + this.removeProgressListener(); } private clearCompletions() { + this.dropdownContentsStale = true; + this.dropdownStyleStale = true; if (this.completionResult !== null) { this.activeIndex = -1; this.completionResult = null; - this.dropdownContentsStale = true; - this.dropdownStyleStale = true; this.commonPrefix = ""; const { completionsVirtualList } = this; if (completionsVirtualList !== undefined) { @@ -786,6 +861,12 @@ export class AutocompleteTextInput extends RefCounted { } this.updateDropdown(); } + + const { completionErrorElement } = this; + if (completionErrorElement !== undefined) { + this.element.removeChild(completionErrorElement); + this.completionErrorElement = undefined; + } } get value() { diff --git a/src/widget/position_plot.ts b/src/widget/position_plot.ts index 0138de285f..960c05c80c 100644 --- a/src/widget/position_plot.ts +++ b/src/widget/position_plot.ts @@ -98,9 +98,9 @@ export class PositionPlot extends RefCounted { visible = true; dragging = new WatchableValue(false); - tickWidth: number = this.orientation === "column" ? 10 : 5; - barWidth: number = this.orientation === "column" ? 15 : 10; - barRightMargin: number = this.orientation === "column" ? 10 : 2; + tickWidth: number; + barWidth: number; + barRightMargin: number; canvasWidth: number; constructor( @@ -109,6 +109,10 @@ export class PositionPlot extends RefCounted { public orientation: "row" | "column" = "column", ) { super(); + this.tickWidth = orientation === "column" ? 10 : 5; + this.barWidth = orientation === "column" ? 15 : 10; + this.barRightMargin = orientation === "column" ? 10 : 2; + this.canvasWidth = this.tickWidth + this.barWidth + this.barRightMargin; const plotElement = this.element; plotElement.classList.add("neuroglancer-position-dimension-plot"); @@ -173,6 +177,7 @@ export class PositionPlot extends RefCounted { this.visible = false; return; } + this.element.style.display = ""; this.visible = true; const { lowerBound, upperBound } = normalizedDimensionBounds; diff --git a/src/widget/position_widget.css b/src/widget/position_widget.css index 24eb022c1f..388fdfd8c0 100644 --- a/src/widget/position_widget.css +++ b/src/widget/position_widget.css @@ -226,8 +226,29 @@ interferes with our click handling. Setting `pointer-events: none;` avoids that height: 12px; } +.neuroglancer-position-tool-in-palette { + display: grid; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-position-widget { + grid-row: 1; + grid-column: 1; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-position-dimension-plot { + grid-row: 2; + grid-column: 1 / 10; +} + +.neuroglancer-position-tool-in-palette > .neuroglancer-checkbox-icon { + grid-row: 1; + grid-column: 9; +} + .neuroglancer-position-tool { background-color: #474747; + display: flex; + flex-direction: row; } .neuroglancer-position-dimension-playback-header { diff --git a/src/widget/position_widget.ts b/src/widget/position_widget.ts index 7dfb1eb6db..e985b8fdaa 100644 --- a/src/widget/position_widget.ts +++ b/src/widget/position_widget.ts @@ -24,6 +24,7 @@ import type { CoordinateSpace, CoordinateSpaceCombiner, DimensionId, + TrackableCoordinateSpace, } from "#src/coordinate_transform.js"; import { clampAndRoundCoordinateToVoxelCenter, @@ -44,6 +45,7 @@ import { makeCachedDerivedWatchableValue, WatchableValue, } from "#src/trackable_value.js"; +import { popDragStatus, pushDragStatus } from "#src/ui/drag_and_drop.js"; import type { LocalToolBinder, ToolActivation } from "#src/ui/tool.js"; import { makeToolActivationStatusMessage, @@ -51,6 +53,8 @@ import { registerTool, Tool, } from "#src/ui/tool.js"; +import type { ToolDragSource } from "#src/ui/tool_drag_and_drop.js"; +import { beginToolDrag, endToolDrag } from "#src/ui/tool_drag_and_drop.js"; import { animationFrameDebounce } from "#src/util/animation_frame_debounce.js"; import { arraysEqual, binarySearch } from "#src/util/array.js"; import { setClipboard } from "#src/util/clipboard.js"; @@ -151,6 +155,8 @@ class DimensionWidget { draggingPosition = false; hasFocus = false; + dimensionIndex: number; + constructor( public coordinateSpace: CoordinateSpace, public id: DimensionId, @@ -175,6 +181,7 @@ class DimensionWidget { container.draggable = true; container.tabIndex = -1; } + this.dimensionIndex = initialDimensionIndex; container.appendChild(nameContainer); container.appendChild(scaleElement); nameContainer.appendChild(nameElement); @@ -230,15 +237,17 @@ class DimensionWidget { ); if (allowFocus) { - nameContainer.addEventListener("dblclick", () => { + nameContainer.addEventListener("dblclick", (event) => { nameElement.disabled = false; nameElement.focus(); nameElement.select(); + event.stopPropagation(); }); - scaleContainer.addEventListener("dblclick", () => { + scaleContainer.addEventListener("dblclick", (event) => { scaleElement.disabled = false; scaleElement.focus(); scaleElement.select(); + event.stopPropagation(); }); coordinate.addEventListener("focus", () => { coordinate.select(); @@ -293,6 +302,7 @@ export class PositionWidget extends RefCounted { private getToolBinder: (() => LocalToolBinder | undefined) | undefined; private allowFocus: boolean; private showPlayback: boolean; + private showDropdown: boolean; private dimensionWidgets = new Map(); private dimensionWidgetList: DimensionWidget[] = []; @@ -470,11 +480,11 @@ export class PositionWidget extends RefCounted { dropdown.appendChild(entryElement); entries.push({ entryElement, coordinateElement, labelElement }); } - // const dropdownOwner = widget.dropdownOwner!; } private openDropdown(widget: DimensionWidget) { if (widget.dropdownOwner !== undefined) return; + if (!this.showDropdown) return; const dimensionIndex = this.getDimensionIndex(widget.id); if (dimensionIndex === -1) return; this.closeDropdown(); @@ -591,13 +601,43 @@ export class PositionWidget extends RefCounted { coordinateSpace, id, initialDimensionIndex, - { allowFocus: this.allowFocus, showPlayback: this.showPlayback }, + { + allowFocus: this.allowFocus, + showPlayback: this.showPlayback, + }, ); + let toolDragSource: ToolDragSource | undefined; + const localBinder = this.getToolBinder?.(); + if (localBinder !== undefined) { + const self = this; + toolDragSource = { + localBinder, + get toolJson() { + return { + type: DIMENSION_TOOL_ID, + dimension: + self.position.coordinateSpace.value.names[ + self.getDimensionIndex(id) + ], + }; + }, + }; + } if (this.singleDimensionId === undefined) { widget.container.addEventListener("dragstart", (event: DragEvent) => { this.dragSource = widget; event.stopPropagation(); event.dataTransfer!.setData("neuroglancer-dimension", ""); + pushDragStatus( + event, + widget.container, + "drag", + "Drag to reorder dimensions, to an existing tool palette, or to the " + + "left/right/top/bottom of another panel to create a new tool palette", + ); + if (toolDragSource !== undefined) { + beginToolDrag(toolDragSource); + } }); widget.container.addEventListener("dragenter", (event: DragEvent) => { const { dragSource } = this; @@ -610,10 +650,13 @@ export class PositionWidget extends RefCounted { this.reorderDimensionTo(targetIndex, sourceIndex); }); widget.container.addEventListener("dragend", (event: DragEvent) => { - event; if (this.dragSource === widget) { this.dragSource = undefined; } + popDragStatus(event, widget.container, "drag"); + if (toolDragSource !== undefined) { + endToolDrag(toolDragSource); + } }); } if (this.allowFocus) { @@ -832,7 +875,7 @@ export class PositionWidget extends RefCounted { coordinateSpace: { value: coordinateSpace }, }, } = this; - if (!coordinateSpace.valid) { + if (!coordinateSpace.valid && this.singleDimensionId === undefined) { coordinateSpace = emptyInvalidCoordinateSpace; } this.coordinateSpace = coordinateSpace; @@ -860,6 +903,7 @@ export class PositionWidget extends RefCounted { widget.maxPositionWidthSeen = maxPositionWidth; } else { widget.coordinateSpace = coordinateSpace; + widget.dimensionIndex = i; } widget.maxPositionWidth = maxPositionWidth; const name = names[i]; @@ -969,12 +1013,14 @@ export class PositionWidget extends RefCounted { private updateNameValidity() { const { dimensionWidgetList } = this; - const names = dimensionWidgetList.map((w) => w.nameElement.value); - const rank = names.length; + const names = Array.from(this.position.coordinateSpace.value.names); + for (const widget of dimensionWidgetList) { + names[widget.dimensionIndex] = widget.nameElement.value; + } const isValid = this.combiner.getRenameValidity(names); - for (let i = 0; i < rank; ++i) { - dimensionWidgetList[i].nameElement.dataset.isValid = - isValid[i] === false ? "false" : "true"; + for (const widget of dimensionWidgetList) { + widget.nameElement.dataset.isValid = + isValid[widget.dimensionIndex] === false ? "false" : "true"; } } @@ -993,6 +1039,7 @@ export class PositionWidget extends RefCounted { getToolBinder = undefined, allowFocus = true, showPlayback = true, + showDropdown = true, }: { copyButton?: boolean; velocity?: CoordinateSpacePlaybackVelocity; @@ -1000,6 +1047,7 @@ export class PositionWidget extends RefCounted { getToolBinder?: (() => LocalToolBinder | undefined) | undefined; allowFocus?: boolean; showPlayback?: boolean; + showDropdown?: boolean; } = {}, ) { super(); @@ -1009,6 +1057,7 @@ export class PositionWidget extends RefCounted { this.getToolBinder = getToolBinder; this.allowFocus = allowFocus; this.showPlayback = showPlayback; + this.showDropdown = showDropdown; this.registerDisposer( position.coordinateSpace.changed.add( this.registerCancellable( @@ -1117,15 +1166,13 @@ export class PositionWidget extends RefCounted { private updatePosition() { if (!this.allowFocus) return; - const { dimensionWidgetList } = this; const { position } = this; const { value: voxelCoordinates } = position; const coordinateSpace = position.coordinateSpace.value; if (voxelCoordinates === undefined) return; - const rank = dimensionWidgetList.length; let modified = false; - for (let i = 0; i < rank; ++i) { - const widget = dimensionWidgetList[i]; + for (const widget of this.dimensionWidgetList) { + const { dimensionIndex } = widget; if (!widget.modified) continue; widget.modified = false; modified = true; @@ -1137,11 +1184,11 @@ export class PositionWidget extends RefCounted { Number.isInteger(value) && !valueString.includes(".") && coordinateSpace !== undefined && - !coordinateSpace.bounds.voxelCenterAtIntegerCoordinates[i] + !coordinateSpace.bounds.voxelCenterAtIntegerCoordinates[dimensionIndex] ) { value += 0.5; } - voxelCoordinates[i] = value; + voxelCoordinates[dimensionIndex] = value; } if (modified) { position.value = voxelCoordinates; @@ -1155,7 +1202,10 @@ export class PositionWidget extends RefCounted { position: { coordinateSpace }, } = this; const existing = coordinateSpace.value; - const names = dimensionWidgetList.map((x) => x.nameElement.value); + const names = Array.from(existing.names); + for (const widget of dimensionWidgetList) { + names[widget.dimensionIndex] = widget.nameElement.value; + } if (this.combiner.getRenameValidity(names).includes(false)) return false; const existingNames = existing.names; if (arraysEqual(existingNames, names)) return false; @@ -1174,17 +1224,18 @@ export class PositionWidget extends RefCounted { position: { coordinateSpace }, } = this; const existing = coordinateSpace.value; - const scalesAndUnits = dimensionWidgetList.map((x) => - parseScale(x.scaleElement.value), - ); - if (scalesAndUnits.includes(undefined)) { - return false; - } - const newScales = Float64Array.from(scalesAndUnits, (x) => x!.scale); - const newUnits = Array.from(scalesAndUnits, (x) => x!.unit); const { scales, units } = existing; - if (arraysEqual(scales, newScales) && arraysEqual(units, newUnits)) + const newScales = Float64Array.from(scales); + const newUnits = Array.from(units); + for (const { dimensionIndex, scaleElement } of dimensionWidgetList) { + const result = parseScale(scaleElement.value); + if (result === undefined) return false; + newScales[dimensionIndex] = result.scale; + newUnits[dimensionIndex] = result.unit; + } + if (arraysEqual(scales, newScales) && arraysEqual(units, newUnits)) { return false; + } const timestamps = existing.timestamps.map((t, i) => newScales[i] === scales[i] && newUnits[i] === units[i] ? t : Date.now(), ); @@ -1215,22 +1266,23 @@ export class PositionWidget extends RefCounted { this.updateDimensions(); const { position: { value: voxelCoordinates }, - dimensionWidgetList, } = this; - const rank = dimensionWidgetList.length; if (voxelCoordinates === undefined) { return; } const coordinateSpace = this.coordinateSpace!; const { velocity } = this; - for (let i = 0; i < rank; ++i) { - const widget = dimensionWidgetList[i]; + for (const widget of this.dimensionWidgetList) { + const { dimensionIndex } = widget; const inputElement = widget.coordinate; - const newCoord = Math.floor(voxelCoordinates[i]); + const newCoord = Math.floor(voxelCoordinates[dimensionIndex]); const newValue = newCoord.toString(); updateCoordinateFieldWidth(widget, newValue); inputElement.value = newValue; - const coordinateArray = getCoordinateArray(coordinateSpace, i); + const coordinateArray = getCoordinateArray( + coordinateSpace, + dimensionIndex, + ); let label = ""; if (coordinateArray != null) { const { coordinates } = coordinateArray; @@ -1242,7 +1294,7 @@ export class PositionWidget extends RefCounted { const labelElement = widget.coordinateLabel; labelElement.textContent = label; if (this.showPlayback) { - const velocityInfo = velocity?.value?.[i]; + const velocityInfo = velocity?.value?.[dimensionIndex]; if (velocityInfo !== undefined) { const paused = velocityInfo.paused; widget.playButton.style.display = paused ? "" : "none"; @@ -1328,11 +1380,68 @@ class DimensionTool extends Tool { return this.viewer.coordinateSpaceCombiner.combined; } + private adjustDimensionHandler( + actionEvent: ActionEvent, + positionWidget: PositionWidget, + ) { + actionEvent.stopPropagation(); + const event = actionEvent.detail; + const { deltaY } = event; + if (deltaY === 0) { + return; + } + positionWidget.adjustDimensionPosition(this.dimensionId, Math.sign(deltaY)); + } + + private adjustVelocityHandler( + actionEvent: ActionEvent, + viewer: SupportsDimensionTool, + ) { + actionEvent.stopPropagation(); + const factor = getWheelZoomAmount(actionEvent.detail); + viewer.velocity.multiplyVelocity(this.dimensionId, factor); + } + activate(activation: ToolActivation) { const { viewer } = this; const { content } = makeToolActivationStatusMessage(activation); - content.classList.add("neuroglancer-position-tool"); + const { positionWidget } = this.makeTool( + activation, + content, + /*inPalette=*/ false, + ); activation.bindInputEventMap(TOOL_INPUT_EVENT_MAP); + activation.bindAction( + "adjust-position-via-wheel", + (actionEvent) => this.adjustDimensionHandler(actionEvent, positionWidget), + ); + activation.bindAction( + "adjust-velocity-via-wheel", + (actionEvent) => this.adjustVelocityHandler(actionEvent, viewer), + ); + activation.bindAction("toggle-playback", (event) => { + event.stopPropagation(); + viewer.velocity.togglePlayback(this.dimensionId); + }); + } + + renderInPalette(context: RefCounted) { + const content = document.createElement("div"); + this.makeTool(context, content, /*inPalette=*/ true); + return content; + } + + private makeTool( + activation: RefCounted, + content: HTMLElement, + inPalette: boolean, + ) { + const { viewer } = this; + if (inPalette) { + content.classList.add("neuroglancer-position-tool-in-palette"); + } else { + content.classList.add("neuroglancer-position-tool"); + } const positionWidget = new PositionWidget( viewer.position, viewer.coordinateSpaceCombiner, @@ -1340,8 +1449,9 @@ class DimensionTool extends Tool { velocity: viewer.velocity, singleDimensionId: this.dimensionId, copyButton: false, - allowFocus: false, + allowFocus: inPalette, showPlayback: false, + showDropdown: false, }, ); positionWidget.element.style.userSelect = "none"; @@ -1351,21 +1461,6 @@ class DimensionTool extends Tool { ); plot.element.style.flex = "1"; content.appendChild(plot.element); - activation.bindAction( - "adjust-position-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const event = actionEvent.detail; - const { deltaY } = event; - if (deltaY === 0) { - return; - } - positionWidget.adjustDimensionPosition( - this.dimensionId, - Math.sign(deltaY), - ); - }, - ); const watchableVelocity = this.velocity.dimensionVelocity( activation, @@ -1470,49 +1565,53 @@ class DimensionTool extends Tool { ).element, ); - activation.bindAction( + this.registerDisposer(new MouseEventBinder(plot.element, inputEventMap)); + + registerActionListener( + plot.element, + "adjust-via-wheel", + (actionEvent) => this.adjustDimensionHandler(actionEvent, positionWidget), + ); + + registerActionListener( + plot.element, "adjust-velocity-via-wheel", - (actionEvent) => { - actionEvent.stopPropagation(); - const factor = getWheelZoomAmount(actionEvent.detail); - viewer.velocity.multiplyVelocity(this.dimensionId, factor); - }, + (actionEvent) => this.adjustVelocityHandler(actionEvent, viewer), ); - activation.bindAction("toggle-playback", (event) => { - event.stopPropagation(); - viewer.velocity.togglePlayback(this.dimensionId); - }); + + return { positionWidget }; + } + + private savedDimensionName: string = ""; + + get dimensionName(): string | undefined { + const { dimensionId } = this; + const coordinateSpace = this.coordinateSpace.value; + const i = coordinateSpace.ids.indexOf(dimensionId); + if (i === -1) return undefined; + return coordinateSpace.names[i]; } get description() { return `dim ${this.dimensionName}`; } - dimensionIndex: number; - dimensionName: string; - constructor( public viewer: SupportsDimensionTool, public dimensionId: DimensionId, ) { super(viewer.toolBinder); - const coordinateSpace = this.coordinateSpace.value; - const i = (this.dimensionIndex = coordinateSpace.ids.indexOf(dimensionId)); - this.dimensionName = coordinateSpace.names[i]; + this.savedDimensionName = this.dimensionName!; this.registerDisposer( this.coordinateSpace.changed.add(() => { - const coordinateSpace = this.coordinateSpace.value; - const i = (this.dimensionIndex = - this.coordinateSpace.value.ids.indexOf(dimensionId)); - if (i === -1) { + const dimensionName = this.dimensionName; + if (dimensionName === undefined) { this.unbind(); return; } - const newName = coordinateSpace.names[i]; - if (this.dimensionName !== newName) { - this.dimensionName = newName; - this.changed.dispatch(); - } + if (dimensionName === this.savedDimensionName) return; + this.savedDimensionName = dimensionName; + this.changed.dispatch(); }), ); } @@ -1535,34 +1634,56 @@ function makeDimensionTool(viewer: SupportsDimensionTool, obj: unknown) { return new DimensionTool(viewer, coordinateSpace.ids[dimensionIndex]); } +function listDimensionTools( + coordinateSpace: TrackableCoordinateSpace, + onChange?: () => void, +) { + if (onChange !== undefined) { + coordinateSpace.changed.addOnce(onChange); + } + return coordinateSpace.value.names.map((name) => ({ + type: DIMENSION_TOOL_ID, + dimension: name, + })); +} + export function registerDimensionToolForViewer(contextType: typeof Viewer) { - registerTool(contextType, DIMENSION_TOOL_ID, (viewer, obj) => - makeDimensionTool( - { - position: viewer.position, - velocity: viewer.velocity, - coordinateSpaceCombiner: - viewer.layerSpecification.coordinateSpaceCombiner, - toolBinder: viewer.toolBinder, - }, - obj, - ), + registerTool( + contextType, + DIMENSION_TOOL_ID, + (viewer, obj) => + makeDimensionTool( + { + position: viewer.position, + velocity: viewer.velocity, + coordinateSpaceCombiner: + viewer.layerSpecification.coordinateSpaceCombiner, + toolBinder: viewer.toolBinder, + }, + obj, + ), + (viewer, onChange) => listDimensionTools(viewer.coordinateSpace, onChange), ); } export function registerDimensionToolForUserLayer( contextType: typeof UserLayer, ) { - registerTool(contextType, DIMENSION_TOOL_ID, (layer, obj) => - makeDimensionTool( - { - position: layer.localPosition, - velocity: layer.localVelocity, - coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, - toolBinder: layer.toolBinder, - }, - obj, - ), + registerTool( + contextType, + DIMENSION_TOOL_ID, + (layer, obj) => + makeDimensionTool( + { + position: layer.localPosition, + velocity: layer.localVelocity, + coordinateSpaceCombiner: layer.localCoordinateSpaceCombiner, + toolBinder: layer.toolBinder, + }, + obj, + ), + (layer, onChange) => + listDimensionTools(layer.localCoordinateSpace, onChange), ); } diff --git a/src/widget/progress_listener.ts b/src/widget/progress_listener.ts new file mode 100644 index 0000000000..970f8c91b5 --- /dev/null +++ b/src/widget/progress_listener.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + ProgressListener, + ProgressSpan, + ProgressSpanId, +} from "#src/util/progress_listener.js"; +import { ProgressSpanSet } from "#src/util/progress_listener.js"; + +export class ProgressListenerWidget implements ProgressListener { + element = document.createElement("ul"); + constructor() { + this.element.classList.add("neuroglancer-progress"); + } + private spanElements = new Map(); + private spans = new ProgressSpanSet(); + + addSpan(span: ProgressSpan) { + if (this.spans.add(span) !== 1) return; + const spanElement = document.createElement("li"); + spanElement.textContent = span.message; + this.spanElements.set(span.id, spanElement); + this.element.appendChild(spanElement); + } + + removeSpan(spanId: ProgressSpanId) { + if (this.spans.deleteKey(spanId) !== 0) return; + const { spanElements } = this; + const spanElement = spanElements.get(spanId)!; + spanElements.delete(spanId); + this.element.removeChild(spanElement); + } +} diff --git a/src/widget/scale_bar.ts b/src/widget/scale_bar.ts index 4d6c8198e7..099014bf7c 100644 --- a/src/widget/scale_bar.ts +++ b/src/widget/scale_bar.ts @@ -273,13 +273,15 @@ export class ScaleBarTexture extends RefCounted { } export class MultipleScaleBarTextures extends RefCounted { - private scaleBarCopyHelper = this.registerDisposer( - OffscreenCopyHelper.get(this.gl), - ); + private scaleBarCopyHelper: OffscreenCopyHelper; private scaleBars: ScaleBarTexture[] = []; constructor(public gl: GL) { super(); + this.scaleBarCopyHelper = this.registerDisposer( + OffscreenCopyHelper.get(this.gl), + ); + for (let i = 0; i < 3; ++i) { this.scaleBars.push(this.registerDisposer(new ScaleBarTexture(gl))); } diff --git a/src/widget/shader_code_widget.ts b/src/widget/shader_code_widget.ts index c86fae81cf..df08d64f1a 100644 --- a/src/widget/shader_code_widget.ts +++ b/src/widget/shader_code_widget.ts @@ -20,8 +20,8 @@ import "codemirror/lib/codemirror.css"; import "codemirror/addon/lint/lint.css"; import CodeMirror from "codemirror"; -import glslCodeMirror from "glsl-editor/glsl.js"; import { debounce } from "lodash-es"; +import glslCodeMirror from "#src/third_party/codemirror-glsl.js"; import type { WatchableValue } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeFromParent } from "#src/util/dom.js"; diff --git a/src/widget/shader_controls.ts b/src/widget/shader_controls.ts index f9a3921430..c3cfd523f0 100644 --- a/src/widget/shader_controls.ts +++ b/src/widget/shader_controls.ts @@ -17,7 +17,6 @@ import { debounce } from "lodash-es"; import type { DisplayContext } from "#src/display_context.js"; import type { UserLayer, UserLayerConstructor } from "#src/layer/index.js"; -import type { ToolActivation } from "#src/ui/tool.js"; import { registerTool } from "#src/ui/tool.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeChildren } from "#src/util/dom.js"; @@ -246,26 +245,27 @@ class ShaderControlTool extends LayerControlTool { control, ), ); + const debounceCheckValidity = this.registerCancellable( + debounce(() => { + if ( + layerShaderControls.shaderControlState.state.get(control) === + undefined + ) { + this.unbind(); + } + }), + ); this.registerDisposer( layerShaderControls.shaderControlState.controls.changed.add( - this.registerCancellable( - debounce(() => { - if ( - layerShaderControls.shaderControlState.state.get(control) === - undefined - ) { - this.unbind(); - } - }), - ), + debounceCheckValidity, ), ); } - activate(activation: ToolActivation) { + + isLoading() { const { shaderControlState } = this.layerShaderControls; const controlState = shaderControlState.state.get(this.control); - if (controlState === undefined) return; - super.activate(activation); + return controlState === undefined; } } @@ -274,12 +274,28 @@ export function registerLayerShaderControlsTool( getter: (layer: LayerType) => LayerShaderControls, toolId: string = SHADER_CONTROL_TOOL_ID, ) { - registerTool(layerType, toolId, (layer, options) => { - const control = verifyObjectProperty( - options, - CONTROL_JSON_KEY, - verifyString, - ); - return new ShaderControlTool(layer, getter(layer), toolId, control); - }); + registerTool( + layerType, + toolId, + (layer, options) => { + const control = verifyObjectProperty( + options, + CONTROL_JSON_KEY, + verifyString, + ); + return new ShaderControlTool(layer, getter(layer), toolId, control); + }, + (layer, onChange) => { + const layerShaderControls = getter(layer); + const { shaderControlState } = layerShaderControls; + if (onChange !== undefined) { + shaderControlState.controls.changed.addOnce(onChange); + } + const map = shaderControlState.state; + return Array.from(map.keys(), (key) => ({ + type: SHADER_CONTROL_TOOL_ID, + [CONTROL_JSON_KEY]: key, + })); + }, + ); } diff --git a/src/widget/text_input.ts b/src/widget/text_input.ts index 322bc485d2..1f3775aa91 100644 --- a/src/widget/text_input.ts +++ b/src/widget/text_input.ts @@ -17,6 +17,15 @@ import type { TrackableValueInterface } from "#src/trackable_value.js"; import { RefCounted } from "#src/util/disposable.js"; import { removeFromParent } from "#src/util/dom.js"; +import { EventActionMap } from "#src/util/event_action_map.js"; +import { + KeyboardEventBinder, + registerActionListener, +} from "#src/util/keyboard_bindings.js"; + +const inputEventMap = EventActionMap.fromObject({ + escape: { action: "cancel" }, +}); export class TextInputWidget extends RefCounted { element = document.createElement("input"); @@ -25,7 +34,20 @@ export class TextInputWidget extends RefCounted { this.registerDisposer(model.changed.add(() => this.updateView())); const { element } = this; element.type = "text"; + element.spellcheck = false; + element.autocomplete = "off"; + const keyboardHandler = this.registerDisposer( + new KeyboardEventBinder(element, inputEventMap), + ); + keyboardHandler.allShortcutsAreGlobal = true; + registerActionListener(element, "cancel", (event) => { + this.updateView(); + element.blur(); + event.stopPropagation(); + event.preventDefault(); + }); this.registerEventListener(element, "change", () => this.updateModel()); + this.registerEventListener(element, "blur", () => this.updateModel()); this.updateView(); } diff --git a/src/widget/transfer_function.ts b/src/widget/transfer_function.ts index cfb53e3bd9..507fab64d6 100644 --- a/src/widget/transfer_function.ts +++ b/src/widget/transfer_function.ts @@ -51,8 +51,7 @@ import { startRelativeMouseDrag } from "#src/util/mouse_drag.js"; import { Uint64 } from "#src/util/uint64.js"; import { getWheelZoomAmount } from "#src/util/wheel_zoom.js"; import type { WatchableVisibilityPriority } from "#src/visibility_priority/frontend.js"; -import type { Buffer } from "#src/webgl/buffer.js"; -import { getMemoizedBuffer } from "#src/webgl/buffer.js"; +import { GLBuffer, getMemoizedBuffer } from "#src/webgl/buffer.js"; import type { GL } from "#src/webgl/context.js"; import type { HistogramSpecifications } from "#src/webgl/empirical_cdf.js"; import { @@ -594,7 +593,7 @@ abstract class BaseLookupTexture extends RefCounted { */ class DirectLookupTableTexture extends BaseLookupTexture { texture: WebGLTexture | null = null; - protected priorOptions: LookupTableTextureOptions | undefined = undefined; + declare protected priorOptions: LookupTableTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); @@ -623,7 +622,7 @@ class DirectLookupTableTexture extends BaseLookupTexture { } export class ControlPointTexture extends BaseLookupTexture { - protected priorOptions: ControlPointTextureOptions | undefined; + declare protected priorOptions: ControlPointTextureOptions | undefined; constructor(public gl: GL | null) { super(gl); } @@ -666,80 +665,88 @@ export class ControlPointTexture extends BaseLookupTexture { } } +function getDataValuesArray() { + const array = new Uint8Array(NUM_CDF_LINES * VERTICES_PER_LINE); + for (let i = 0; i < NUM_CDF_LINES; ++i) { + for (let j = 0; j < VERTICES_PER_LINE; ++j) { + array[i * VERTICES_PER_LINE + j] = i; + } + } + return array; +} + +function getTextureVertexBufferArray() { + return createGriddedRectangleArray(TRANSFER_FUNCTION_PANEL_SIZE); +} + /** * Display the UI canvas for the transfer function widget and * handle shader updates for elements of the canvas */ class TransferFunctionPanel extends IndirectRenderedPanel { texture: DirectLookupTableTexture; - private textureVertexBuffer: Buffer; - private textureVertexBufferArray: Float32Array; - private controlPointsVertexBuffer: Buffer; + private textureVertexBuffer: GLBuffer; + private controlPointsVertexBuffer: GLBuffer; private controlPointsPositionArray = new Float32Array(); - private controlPointsColorBuffer: Buffer; + private controlPointsColorBuffer: GLBuffer; private controlPointsColorArray = new Float32Array(); - private linePositionBuffer: Buffer; + private linePositionBuffer: GLBuffer; private linePositionArray = new Float32Array(); get drawOrder() { return 1; } - transferFunction = this.registerDisposer( - new TransferFunction( - this.parent.dataType, - this.parent.trackable, - TRANSFER_FUNCTION_PANEL_SIZE, - ), - ); - controller = this.registerDisposer( - new TransferFunctionController( - this.element, - this.parent.dataType, - this.transferFunction, - () => this.parent.trackable.value, - (value: TransferFunctionParameters) => { - this.parent.trackable.value = value; - }, - ), - ); - private dataValuesBuffer = this.registerDisposer( - getMemoizedBuffer(this.gl, WebGL2RenderingContext.ARRAY_BUFFER, () => { - const array = new Uint8Array(NUM_CDF_LINES * VERTICES_PER_LINE); - for (let i = 0; i < NUM_CDF_LINES; ++i) { - for (let j = 0; j < VERTICES_PER_LINE; ++j) { - array[i * VERTICES_PER_LINE + j] = i; - } - } - return array; - }), - ).value; + transferFunction: TransferFunction; + controller: TransferFunctionController; + private dataValuesBuffer; constructor(public parent: TransferFunctionWidget) { super(parent.display, document.createElement("div"), parent.visibility); const { element, gl } = this; - element.classList.add("neuroglancer-transfer-function-panel"); - this.textureVertexBufferArray = createGriddedRectangleArray( - TRANSFER_FUNCTION_PANEL_SIZE, + + this.transferFunction = this.registerDisposer( + new TransferFunction( + parent.dataType, + parent.trackable, + TRANSFER_FUNCTION_PANEL_SIZE, + ), ); + this.controller = this.registerDisposer( + new TransferFunctionController( + element, + parent.dataType, + this.transferFunction, + () => parent.trackable.value, + (value: TransferFunctionParameters) => { + parent.trackable.value = value; + }, + ), + ); + this.dataValuesBuffer = this.registerDisposer( + getMemoizedBuffer( + gl, + WebGL2RenderingContext.ARRAY_BUFFER, + getDataValuesArray, + ), + ).value; + + element.classList.add("neuroglancer-transfer-function-panel"); this.texture = this.registerDisposer(new DirectLookupTableTexture(gl)); - function createBuffer(dataArray: Float32Array) { - return getMemoizedBuffer( + this.textureVertexBuffer = this.registerDisposer( + getMemoizedBuffer( gl, WebGL2RenderingContext.ARRAY_BUFFER, - () => dataArray, - ).value; - } - this.textureVertexBuffer = this.registerDisposer( - createBuffer(this.textureVertexBufferArray), - ); + getTextureVertexBufferArray, + ), + ).value; this.controlPointsVertexBuffer = this.registerDisposer( - createBuffer(this.controlPointsPositionArray), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.controlPointsColorBuffer = this.registerDisposer( - createBuffer(this.controlPointsColorArray), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); this.linePositionBuffer = this.registerDisposer( - createBuffer(this.linePositionArray), + new GLBuffer(gl, WebGL2RenderingContext.ARRAY_BUFFER), ); } diff --git a/src/worker_rpc.ts b/src/worker_rpc.ts index 3ea514efda..d80804a38b 100644 --- a/src/worker_rpc.ts +++ b/src/worker_rpc.ts @@ -14,14 +14,14 @@ * limitations under the License. */ -import type { CancellationToken } from "#src/util/cancellation.js"; -import { - CANCELED, - CancellationTokenSource, - makeCancelablePromise, - uncancelableToken, -} from "#src/util/cancellation.js"; +import { promiseWithResolversAndAbortCallback } from "#src/util/abort.js"; import { RefCounted } from "#src/util/disposable.js"; +import type { + ProgressListener, + ProgressOptions, + ProgressSpanId, +} from "#src/util/progress_listener.js"; +import { ProgressSpan } from "#src/util/progress_listener.js"; export type RPCHandler = (this: RPC, x: any) => void; @@ -35,6 +35,8 @@ const DEBUG_MESSAGES = false; const PROMISE_RESPONSE_ID = "rpc.promise.response"; const PROMISE_CANCEL_ID = "rpc.promise.cancel"; +const PROMISE_PROGRESS_ADD_SPAN_ID = "rpc.promise.addProgressSpan"; +const PROMISE_PROGRESS_REMOVE_SPAN_ID = "rpc.promise.removeProgressSpan"; const READY_ID = "rpc.ready"; const handlers = new Map(); @@ -45,12 +47,27 @@ export function registerRPC(key: string, handler: RPCHandler) { export type RPCPromise = Promise<{ value: T; transfers?: any[] }>; -export class RPCError extends Error { +class ProxyProgressListener implements ProgressListener { constructor( - public name: string, - public message: string, - ) { - super(message); + private rpc: RPC, + private id: number, + ) {} + + addSpan(span: ProgressSpan) { + this.rpc.invoke(PROMISE_PROGRESS_ADD_SPAN_ID, { + id: this.id, + span: { + id: span.id, + message: span.message, + startTime: span.startTime, + }, + }); + } + removeSpan(spanId: ProgressSpanId) { + this.rpc.invoke(PROMISE_PROGRESS_REMOVE_SPAN_ID, { + id: this.id, + spanId, + }); } } @@ -59,14 +76,21 @@ export function registerPromiseRPC( handler: ( this: RPC, x: any, - cancellationToken: CancellationToken, + progressOptions: Partial, ) => RPCPromise, ) { registerRPC(key, function (this: RPC, x: any) { const id = x.id; - const cancellationToken = new CancellationTokenSource(); - const promise = handler.call(this, x, cancellationToken) as RPCPromise; - this.set(id, { promise, cancellationToken }); + const abortController = new AbortController(); + let progressListener: ProgressListener | undefined; + if (x.progressListener === true) { + progressListener = new ProxyProgressListener(this, id); + } + const promise = handler.call(this, x, { + signal: abortController.signal, + progressListener, + }) as RPCPromise; + this.set(id, { promise, abortController }); promise.then( ({ value, transfers }) => { this.delete(id); @@ -76,8 +100,7 @@ export function registerPromiseRPC( this.delete(id); this.invoke(PROMISE_RESPONSE_ID, { id: id, - error: error.message, - errorName: error.name, + error: error, }); }, ); @@ -88,8 +111,8 @@ registerRPC(PROMISE_CANCEL_ID, function (this: RPC, x: any) { const id = x.id; const request = this.get(id); if (request !== undefined) { - const { cancellationToken } = request; - cancellationToken.cancel(); + const { abortController } = request; + abortController.abort(); } }); @@ -100,15 +123,22 @@ registerRPC(PROMISE_RESPONSE_ID, function (this: RPC, x: any) { if (Object.prototype.hasOwnProperty.call(x, "value")) { resolve(x.value); } else { - const errorName = x.errorName; - if (errorName === CANCELED.name) { - reject(CANCELED); - } else { - reject(new RPCError(x.errorName, x.error)); - } + reject(x.error); } }); +registerRPC(PROMISE_PROGRESS_ADD_SPAN_ID, function (this: RPC, x: any) { + const id = x.id; + const { progressListener } = this.get(id); + new ProgressSpan(progressListener, x.span); +}); + +registerRPC(PROMISE_PROGRESS_REMOVE_SPAN_ID, function (this: RPC, x: any) { + const id = x.id; + const { progressListener } = this.get(id); + progressListener.removeSpan(x.spanId); +}); + registerRPC(READY_ID, function (this: RPC, x: any) { x; this.onPeerReady(); @@ -137,6 +167,10 @@ export class RPC { if (DEBUG_MESSAGES) { console.log("Received message", data); } + const handler = handlers.get(data.functionName); + if (handler === undefined) { + throw new Error(`Missing RPC function: ${data.functionName}`); + } handlers.get(data.functionName)!.call(this, data); }; } @@ -204,21 +238,36 @@ export class RPC { promiseInvoke( name: string, x: any, - cancellationToken = uncancelableToken, - transfers?: any[], + options?: { + signal?: AbortSignal; + progressListener?: ProgressListener; + transfers?: any[]; + }, ): Promise { - return makeCancelablePromise( - cancellationToken, - (resolve, reject, token) => { - const id = (x.id = this.newId()); - this.set(id, { resolve, reject }); - this.invoke(name, x, transfers); - token.add(() => { - this.invoke(PROMISE_CANCEL_ID, { id: id }); - }); - }, - ); + let signal: AbortSignal | undefined; + let progressListener: ProgressListener | undefined; + let transfers: any[] | undefined; + if (options !== undefined) { + ({ signal, progressListener, transfers } = options); + } + if (signal?.aborted) { + return Promise.reject(signal.reason); + } + if (progressListener !== undefined) { + x.progressListener = true; + } + const id = (x.id = this.newId()); + this.invoke(name, x, transfers); + const { promise, resolve, reject } = + signal === undefined + ? Promise.withResolvers() + : promiseWithResolversAndAbortCallback(signal, () => { + this.invoke(PROMISE_CANCEL_ID, { id: id }); + }); + this.set(id, { resolve, reject, progressListener }); + return promise; } + newId() { return IS_WORKER ? this.nextId-- : this.nextId++; } @@ -303,7 +352,7 @@ export class SharedObject extends RefCounted { * Should be set to a constant specifying the SharedObject type identifier on the prototype of * final derived owner classes. It is not used on counterpart (non-owner) classes. */ - RPC_TYPE_ID: string; + declare RPC_TYPE_ID: string; } export function initializeSharedObjectCounterpart( diff --git a/templates/sliceview/compressed_segmentation/decode.template.ts b/templates/sliceview/compressed_segmentation/decode.template.ts index a54d9be097..5cf984a321 100644 --- a/templates/sliceview/compressed_segmentation/decode.template.ts +++ b/templates/sliceview/compressed_segmentation/decode.template.ts @@ -19,10 +19,10 @@ * Support for decompressing uint64 segment label chunks. */ -import {decodeValueOffset} from 'neuroglancer/sliceview/compressed_segmentation/decode_common'; +import {decodeValueOffset} from '#src/sliceview/compressed_segmentation/decode_common.js'; /*% if dataType == 'uint64' %*/ -import {Uint64} from 'neuroglancer/util/uint64'; +import {Uint64} from '#src/util/uint64.js'; /*% endif %*/ /** diff --git a/templates/sliceview/compressed_segmentation/encode.template.ts b/templates/sliceview/compressed_segmentation/encode.template.ts index 126dc2a39c..177991d62f 100644 --- a/templates/sliceview/compressed_segmentation/encode.template.ts +++ b/templates/sliceview/compressed_segmentation/encode.template.ts @@ -19,11 +19,11 @@ * Support for compressing uint32/uint64 segment label chunks. */ -import {encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock} from 'neuroglancer/sliceview/compressed_segmentation/encode_common'; -import {getFortranOrderStrides} from 'neuroglancer/util/array'; -import {Uint32ArrayBuilder} from 'neuroglancer/util/uint32array_builder'; +import {encodeChannel as encodeChannelCommon, encodeChannels as encodeChannelsCommon, writeBlock} from '#src/sliceview/compressed_segmentation/encode_common.js'; +import {getFortranOrderStrides} from '#src/util/array.js'; +import {Uint32ArrayBuilder} from '#src/util/uint32array_builder.js'; -export {newCache} from 'neuroglancer/sliceview/compressed_segmentation/encode_common'; +export {newCache} from '#src/sliceview/compressed_segmentation/encode_common.js'; let tempEncodingBuffer: Uint32Array; let tempValuesBuffer1: Uint32Array; @@ -39,7 +39,8 @@ export function encodeBlock( cache: Map, output: Uint32ArrayBuilder): [number, number] { const ax = actualSize[0], ay = actualSize[1], az = actualSize[2]; const bx = blockSize[0], by = blockSize[1], bz = blockSize[2]; - let sx = inputStrides[0], sy = inputStrides[1], sz = inputStrides[2]; + const sx = inputStrides[0]; + let sy = inputStrides[1], sz = inputStrides[2]; sz -= sy * ay; sy -= sx * ax; if (ax * ay * az === 0) { diff --git a/templates/sliceview/compressed_segmentation/encode_common.template.ts b/templates/sliceview/compressed_segmentation/encode_common.template.ts index 71ae905d23..263878fd70 100644 --- a/templates/sliceview/compressed_segmentation/encode_common.template.ts +++ b/templates/sliceview/compressed_segmentation/encode_common.template.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {Uint32ArrayBuilder} from 'neuroglancer/util/uint32array_builder'; +import {Uint32ArrayBuilder} from '#src/util/uint32array_builder.js'; export const BLOCK_HEADER_SIZE = 2; diff --git a/templates/util/pairing_heap.template.ts b/templates/util/pairing_heap.template.ts index 5f1f50c9eb..ab46374a10 100644 --- a/templates/util/pairing_heap.template.ts +++ b/templates/util/pairing_heap.template.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import {PairingHeapOperations} from 'neuroglancer/util/pairing_heap'; +import { PairingHeapOperations } from "#src/util/pairing_heap.js"; interface Node { CHILD_PROPERTY: T|null; diff --git a/templates/util/typedarray_builder.template.ts b/templates/util/typedarray_builder.template.ts index b448b27670..2f438c1fba 100644 --- a/templates/util/typedarray_builder.template.ts +++ b/templates/util/typedarray_builder.template.ts @@ -16,7 +16,7 @@ export class $TYPE$Builder { length = 0; - data: $TYPE$; + data: $TYPE$; constructor(initialCapacity: number = 16) { this.data = new $TYPE$(initialCapacity); @@ -34,7 +34,7 @@ export class $TYPE$Builder { get view() { let {data} = this; - return new $TYPE$(data.buffer, data.byteOffset, this.length); + return new $TYPE$(data.buffer, data.byteOffset, this.length); } shrinkToFit() { diff --git a/testdata/64x64x64-raw-uint64-segmentation.dat b/testdata/codec/compressed_segmentation/64x64x64-raw-uint64-segmentation.dat similarity index 100% rename from testdata/64x64x64-raw-uint64-segmentation.dat rename to testdata/codec/compressed_segmentation/64x64x64-raw-uint64-segmentation.dat diff --git a/testdata/README.md b/testdata/codec/compressed_segmentation/README.md similarity index 100% rename from testdata/README.md rename to testdata/codec/compressed_segmentation/README.md diff --git a/testdata/generate_npy_examples.py b/testdata/codec/npy/generate_npy_examples.py similarity index 100% rename from testdata/generate_npy_examples.py rename to testdata/codec/npy/generate_npy_examples.py diff --git a/testdata/npy_test.float32-be.npy b/testdata/codec/npy/npy_test.float32-be.npy similarity index 100% rename from testdata/npy_test.float32-be.npy rename to testdata/codec/npy/npy_test.float32-be.npy diff --git a/testdata/npy_test.float32-le.npy b/testdata/codec/npy/npy_test.float32-le.npy similarity index 100% rename from testdata/npy_test.float32-le.npy rename to testdata/codec/npy/npy_test.float32-le.npy diff --git a/testdata/npy_test.float32.json b/testdata/codec/npy/npy_test.float32.json similarity index 100% rename from testdata/npy_test.float32.json rename to testdata/codec/npy/npy_test.float32.json diff --git a/testdata/npy_test.uint16-be.npy b/testdata/codec/npy/npy_test.uint16-be.npy similarity index 100% rename from testdata/npy_test.uint16-be.npy rename to testdata/codec/npy/npy_test.uint16-be.npy diff --git a/testdata/npy_test.uint16-le.npy b/testdata/codec/npy/npy_test.uint16-le.npy similarity index 100% rename from testdata/npy_test.uint16-le.npy rename to testdata/codec/npy/npy_test.uint16-le.npy diff --git a/testdata/npy_test.uint16.json b/testdata/codec/npy/npy_test.uint16.json similarity index 100% rename from testdata/npy_test.uint16.json rename to testdata/codec/npy/npy_test.uint16.json diff --git a/testdata/npy_test.uint32-be.npy b/testdata/codec/npy/npy_test.uint32-be.npy similarity index 100% rename from testdata/npy_test.uint32-be.npy rename to testdata/codec/npy/npy_test.uint32-be.npy diff --git a/testdata/npy_test.uint32-le.npy b/testdata/codec/npy/npy_test.uint32-le.npy similarity index 100% rename from testdata/npy_test.uint32-le.npy rename to testdata/codec/npy/npy_test.uint32-le.npy diff --git a/testdata/npy_test.uint32.json b/testdata/codec/npy/npy_test.uint32.json similarity index 100% rename from testdata/npy_test.uint32.json rename to testdata/codec/npy/npy_test.uint32.json diff --git a/testdata/npy_test.uint64-be.npy b/testdata/codec/npy/npy_test.uint64-be.npy similarity index 100% rename from testdata/npy_test.uint64-be.npy rename to testdata/codec/npy/npy_test.uint64-be.npy diff --git a/testdata/npy_test.uint64-le.npy b/testdata/codec/npy/npy_test.uint64-le.npy similarity index 100% rename from testdata/npy_test.uint64-le.npy rename to testdata/codec/npy/npy_test.uint64-le.npy diff --git a/testdata/npy_test.uint64.json b/testdata/codec/npy/npy_test.uint64.json similarity index 100% rename from testdata/npy_test.uint64.json rename to testdata/codec/npy/npy_test.uint64.json diff --git a/testdata/npy_test.uint8.json b/testdata/codec/npy/npy_test.uint8.json similarity index 100% rename from testdata/npy_test.uint8.json rename to testdata/codec/npy/npy_test.uint8.json diff --git a/testdata/npy_test.uint8.npy b/testdata/codec/npy/npy_test.uint8.npy similarity index 100% rename from testdata/npy_test.uint8.npy rename to testdata/codec/npy/npy_test.uint8.npy diff --git a/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi b/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi new file mode 100644 index 0000000000..10bb89f11b --- /dev/null +++ b/testdata/datasource/deepzoom/14122_mPPC_BDA_s186.dzi @@ -0,0 +1,4 @@ + + + + diff --git a/testdata/datasource/n5/generate_n5.py b/testdata/datasource/n5/generate_n5.py new file mode 100755 index 0000000000..7bd8ff79c6 --- /dev/null +++ b/testdata/datasource/n5/generate_n5.py @@ -0,0 +1,69 @@ +#!/usr/bin/env -S uv run +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "tensorstore", +# ] +# /// +import json +import os +import pathlib +import shutil + +import tensorstore as ts + + +def write_multiscale( + path, include_top_level_scales: bool, include_per_scale_downsampling_factors: bool +): + shutil.rmtree(path, ignore_errors=True) + shape = [10, 20] + scales = [] + for scale in [0, 1, 2]: + downsample_factors = [2**scale, 2**scale] + scales.append(downsample_factors) + scale_path = os.path.join(path, f"s{scale}") + scale_attributes = {} + if include_per_scale_downsampling_factors: + scale_attributes["downsamplingFactors"] = downsample_factors + ts.open( + { + "driver": "n5", + "kvstore": {"driver": "file", "path": scale_path}, + "metadata": scale_attributes, + }, + create=True, + delete_existing=True, + dtype=ts.uint16, + shape=[ + -(-shape[0] // downsample_factors[0]), + -(-shape[1] // downsample_factors[1]), + ], + ).result() + top_level_attributes = { + "axes": ["x", "y"], + "units": ["nm", "s"], + "resolution": [10, 20], + } + if include_top_level_scales: + top_level_attributes["scales"] = scales + pathlib.Path(os.path.join(path, "attributes.json")).write_text( + json.dumps(top_level_attributes) + ) + + +write_multiscale( + os.path.abspath( + os.path.join(os.path.dirname(__file__), "n5_viewer_multiscale_deprecated") + ), + include_top_level_scales=True, + include_per_scale_downsampling_factors=False, +) + +write_multiscale( + os.path.abspath( + os.path.join(os.path.dirname(__file__), "n5_viewer_multiscale_modern") + ), + include_top_level_scales=False, + include_per_scale_downsampling_factors=True, +) diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json new file mode 100644 index 0000000000..7311cde9a8 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/attributes.json @@ -0,0 +1 @@ +{"axes": ["x", "y"], "units": ["nm", "s"], "resolution": [10, 20], "scales": [[1, 1], [2, 2], [4, 4]]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json new file mode 100644 index 0000000000..7254f6e6fa --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s0/attributes.json @@ -0,0 +1 @@ +{"blockSize":[10,20],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[10,20]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json new file mode 100644 index 0000000000..1a935f8806 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s1/attributes.json @@ -0,0 +1 @@ +{"blockSize":[5,10],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[5,10]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json new file mode 100644 index 0000000000..2c2d38eab1 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_deprecated/s2/attributes.json @@ -0,0 +1 @@ +{"blockSize":[3,5],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[3,5]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json new file mode 100644 index 0000000000..2b49d435e7 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/attributes.json @@ -0,0 +1 @@ +{"axes": ["x", "y"], "units": ["nm", "s"], "resolution": [10, 20]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json new file mode 100644 index 0000000000..1d0eb09bc9 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s0/attributes.json @@ -0,0 +1 @@ +{"blockSize":[10,20],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[10,20],"downsamplingFactors":[1,1]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json new file mode 100644 index 0000000000..08ca0551a5 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s1/attributes.json @@ -0,0 +1 @@ +{"blockSize":[5,10],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[5,10],"downsamplingFactors":[2,2]} \ No newline at end of file diff --git a/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json b/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json new file mode 100644 index 0000000000..8f77ef7ea7 --- /dev/null +++ b/testdata/datasource/n5/n5_viewer_multiscale_modern/s2/attributes.json @@ -0,0 +1 @@ +{"blockSize":[3,5],"compression":{"blocksize":0,"clevel":5,"cname":"lz4","shuffle":1,"type":"blosc"},"dataType":"uint16","dimensions":[3,5],"downsamplingFactors":[4,4]} \ No newline at end of file diff --git a/testdata/datasource/nifti/README.md b/testdata/datasource/nifti/README.md new file mode 100644 index 0000000000..0aaf544ebd --- /dev/null +++ b/testdata/datasource/nifti/README.md @@ -0,0 +1,35 @@ +The following test files: + +- example_nifti2.nii.gz +- standard.nii.gz +- standard.nii (derived from standard.nii.gz) + +were copied from nibabel, and are subject to the following license: + +The MIT License + +Copyright (c) 2009-2019 Matthew Brett +Copyright (c) 2010-2013 Stephan Gerhard +Copyright (c) 2006-2014 Michael Hanke +Copyright (c) 2011 Christian Haselgrove +Copyright (c) 2010-2011 Jarrod Millman +Copyright (c) 2011-2019 Yaroslav Halchenko +Copyright (c) 2015-2019 Chris Markiewicz + +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/testdata/datasource/nifti/example_nifti2.nii.gz b/testdata/datasource/nifti/example_nifti2.nii.gz new file mode 100644 index 0000000000..a0d9e408f4 Binary files /dev/null and b/testdata/datasource/nifti/example_nifti2.nii.gz differ diff --git a/testdata/datasource/nifti/standard.nii b/testdata/datasource/nifti/standard.nii new file mode 100644 index 0000000000..d685a25135 Binary files /dev/null and b/testdata/datasource/nifti/standard.nii differ diff --git a/testdata/datasource/nifti/standard.nii.gz b/testdata/datasource/nifti/standard.nii.gz new file mode 100644 index 0000000000..98bb31a778 Binary files /dev/null and b/testdata/datasource/nifti/standard.nii.gz differ diff --git a/testdata/datasource/precomputed/generate_precomputed.py b/testdata/datasource/precomputed/generate_precomputed.py new file mode 100755 index 0000000000..24e72e36e8 --- /dev/null +++ b/testdata/datasource/precomputed/generate_precomputed.py @@ -0,0 +1,46 @@ +#!/usr/bin/env -S uv run +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "tensorstore", +# "numpy", +# ] +# /// +import os +import shutil + +import numpy as np +import tensorstore as ts + + +def write_multiscale(path: str, num_channels: int, num_scales: int): + shutil.rmtree(path, ignore_errors=True) + shape = np.array([10, 20, 30, num_channels]) + base_resolution = np.array([3, 4, 5]) + for scale in range(num_scales): + downsample_factors = [2**scale, 2**scale, 2**scale, 1] + ts.open( + { + "driver": "neuroglancer_precomputed", + "kvstore": {"driver": "file", "path": path}, + "scale_metadata": { + "resolution": base_resolution * downsample_factors[:-1] + }, + }, + create=True, + dtype=ts.uint16, + shape=-(-shape // downsample_factors), + ).result() + + +write_multiscale( + os.path.abspath(os.path.join(os.path.dirname(__file__), "one_channel")), + num_channels=1, + num_scales=3, +) + +write_multiscale( + os.path.abspath(os.path.join(os.path.dirname(__file__), "two_channels")), + num_channels=2, + num_scales=3, +) diff --git a/testdata/datasource/precomputed/one_channel/info b/testdata/datasource/precomputed/one_channel/info new file mode 100644 index 0000000000..1408773d9f --- /dev/null +++ b/testdata/datasource/precomputed/one_channel/info @@ -0,0 +1 @@ +{"@type":"neuroglancer_multiscale_volume","data_type":"uint16","num_channels":1,"scales":[{"chunk_sizes":[[10,20,30]],"encoding":"raw","key":"3_4_5","resolution":[3.0,4.0,5.0],"size":[10,20,30],"voxel_offset":[0,0,0]},{"chunk_sizes":[[5,10,15]],"encoding":"raw","key":"6_8_10","resolution":[6.0,8.0,10.0],"size":[5,10,15],"voxel_offset":[0,0,0]},{"chunk_sizes":[[3,5,8]],"encoding":"raw","key":"12_16_20","resolution":[12.0,16.0,20.0],"size":[3,5,8],"voxel_offset":[0,0,0]}],"type":"image"} \ No newline at end of file diff --git a/testdata/datasource/precomputed/two_channels/info b/testdata/datasource/precomputed/two_channels/info new file mode 100644 index 0000000000..58769bce6f --- /dev/null +++ b/testdata/datasource/precomputed/two_channels/info @@ -0,0 +1 @@ +{"@type":"neuroglancer_multiscale_volume","data_type":"uint16","num_channels":2,"scales":[{"chunk_sizes":[[10,20,30]],"encoding":"raw","key":"3_4_5","resolution":[3.0,4.0,5.0],"size":[10,20,30],"voxel_offset":[0,0,0]},{"chunk_sizes":[[5,10,15]],"encoding":"raw","key":"6_8_10","resolution":[6.0,8.0,10.0],"size":[5,10,15],"voxel_offset":[0,0,0]},{"chunk_sizes":[[3,5,8]],"encoding":"raw","key":"12_16_20","resolution":[12.0,16.0,20.0],"size":[3,5,8],"voxel_offset":[0,0,0]}],"type":"image"} \ No newline at end of file diff --git a/testdata/datasource/zarr/ome_zarr/generate_ome_zarr.py b/testdata/datasource/zarr/ome_zarr/generate_ome_zarr.py new file mode 100755 index 0000000000..067df00325 --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/generate_ome_zarr.py @@ -0,0 +1,85 @@ +#!/usr/bin/env -S uv run --script +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "ngff-zarr[tensorstore]", +# "numpy", +# "tensorstore", +# ] +# /// + +import os +import pathlib +import shutil +import zipfile + +import ngff_zarr as nz +import numpy as np +import tensorstore as ts + +THIS_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def write_data(path: str, version: str): + shape = [10, 10] + + data = np.arange(np.prod(shape), dtype=np.uint16).reshape(shape) + + image = nz.to_ngff_image( + data, + dims=["y", "x"], + scale={"y": 4, "x": 30}, + axes_units={"y": "nanometer", "x": "nanometer"}, + ) + + multiscales = nz.to_multiscales( + image, scale_factors=[{"x": 2, "y": 2}, {"x": 4, "y": 4}] + ) + + full_path = os.path.join(THIS_DIR, path) + shutil.rmtree(full_path, ignore_errors=True) + + nz.to_ngff_zarr( + full_path, + multiscales, + use_tensorstore=True, + version=version, + ) + + +def create_ocdbt(files_dir: str, ocdbt_dir: str): + shutil.rmtree(ocdbt_dir, ignore_errors=True) + + kvs = ts.KvStore.open( + { + "driver": "ocdbt", + "base": {"driver": "file", "path": ocdbt_dir}, + "assume_config": True, + } + ).result() + + with ts.Transaction(atomic=True) as txn: + for root, dirs, files in os.walk(files_dir): + for filename in files: + entry_path = os.path.join(root, filename) + kvs.with_transaction(txn)[os.path.relpath(entry_path, files_dir)] = ( + pathlib.Path(entry_path).read_bytes() + ) + + +def create_zip(directory_path: str, zip_path: str): + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_STORED) as zipf: + for root, dirs, files in os.walk(directory_path): + for filename in files: + entry_path = os.path.join(root, filename) + zipf.write(entry_path, os.path.relpath(entry_path, directory_path)) + + +write_data("simple_0.4", version="0.4") +write_data("simple_0.5", version="0.5") +create_zip( + os.path.join(THIS_DIR, "simple_0.5"), os.path.join(THIS_DIR, "simple_0.5.zip") +) +create_ocdbt( + os.path.join(THIS_DIR, "simple_0.5"), os.path.join(THIS_DIR, "simple_0.5.ocdbt") +) diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs new file mode 100644 index 0000000000..8881cf31db --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zattrs @@ -0,0 +1,80 @@ +{ + "multiscales": [ + { + "axes": [ + { + "name": "y", + "type": "space", + "unit": "nanometer" + }, + { + "name": "x", + "type": "space", + "unit": "nanometer" + } + ], + "datasets": [ + { + "path": "scale0/image", + "coordinateTransformations": [ + { + "scale": [ + 4, + 30 + ], + "type": "scale" + }, + { + "translation": [ + 0.0, + 0.0 + ], + "type": "translation" + } + ] + }, + { + "path": "scale1/image", + "coordinateTransformations": [ + { + "scale": [ + 8, + 60 + ], + "type": "scale" + }, + { + "translation": [ + 2, + 15 + ], + "type": "translation" + } + ] + }, + { + "path": "scale2/image", + "coordinateTransformations": [ + { + "scale": [ + 16, + 120 + ], + "type": "scale" + }, + { + "translation": [ + 6, + 45 + ], + "type": "translation" + } + ] + } + ], + "name": "image", + "version": "0.4", + "@type": "ngff:Image" + } + ] +} \ No newline at end of file diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup new file mode 100644 index 0000000000..cab13da6ee --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zgroup @@ -0,0 +1,3 @@ +{ + "zarr_format": 2 +} \ No newline at end of file diff --git a/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata new file mode 100644 index 0000000000..18b2fe0a54 --- /dev/null +++ b/testdata/datasource/zarr/ome_zarr/simple_0.4/.zmetadata @@ -0,0 +1,202 @@ +{ + "metadata": { + ".zgroup": { + "zarr_format": 2 + }, + ".zattrs": { + "multiscales": [ + { + "axes": [ + { + "name": "y", + "type": "space", + "unit": "nanometer" + }, + { + "name": "x", + "type": "space", + "unit": "nanometer" + } + ], + "datasets": [ + { + "path": "scale0/image", + "coordinateTransformations": [ + { + "scale": [ + 4, + 30 + ], + "type": "scale" + }, + { + "translation": [ + 0.0, + 0.0 + ], + "type": "translation" + } + ] + }, + { + "path": "scale1/image", + "coordinateTransformations": [ + { + "scale": [ + 8, + 60 + ], + "type": "scale" + }, + { + "translation": [ + 2, + 15 + ], + "type": "translation" + } + ] + }, + { + "path": "scale2/image", + "coordinateTransformations": [ + { + "scale": [ + 16, + 120 + ], + "type": "scale" + }, + { + "translation": [ + 6, + 45 + ], + "type": "translation" + } + ] + } + ], + "name": "image", + "version": "0.4", + "@type": "ngff:Image" + } + ] + }, + "scale2/.zattrs": { + "_ARRAY_DIMENSIONS": [ + "y", + "x" + ] + }, + "scale2/.zgroup": { + "zarr_format": 2, + "consolidated_metadata": { + "metadata": {}, + "must_understand": false, + "kind": "inline" + } + }, + "scale2/image/.zattrs": {}, + "scale2/image/.zarray": { + "shape": [ + 2, + 2 + ], + "chunks": [ + 2, + 2 + ], + "fill_value": null, + "order": "C", + "filters": null, + "dimension_separator": "/", + "compressor": { + "id": "blosc", + "cname": "lz4", + "clevel": 5, + "shuffle": -1, + "blocksize": 0 + }, + "zarr_format": 2, + "dtype": "=3", +# ] +# /// + +import asyncio +import json +import os +import pathlib +import shutil + +import icechunk +import numpy as np +import zarr +import zarr.core.buffer + +SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def write_zarr_array(name): + storage_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + shutil.rmtree(storage_dir, ignore_errors=True) + storage = icechunk.local_filesystem_storage(storage_dir) + + repo = icechunk.Repository.create(storage) + + session = repo.writable_session("main") + + a = zarr.create( + shape=[6, 7], + chunks=[4, 5], + dtype="uint8", + store=session.store, + compressor=None, + ) + a[...] = np.arange(np.prod(a.shape), dtype=a.dtype).reshape(a.shape) + + session.commit("first commit") + + main_snapshot = repo.lookup_branch("main") + + repo.create_branch("other_branch", main_snapshot) + repo.create_tag("tag1", main_snapshot) + repo.create_tag("tag2", main_snapshot) + repo.create_tag("tag3", main_snapshot) + repo.delete_tag("tag3") + + +def write_zarr_hierarchy(name): + storage_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + shutil.rmtree(storage_dir, ignore_errors=True) + storage = icechunk.local_filesystem_storage(storage_dir) + + repo = icechunk.Repository.create(storage) + + session = repo.writable_session("main") + + root = zarr.group(session.store, attributes={"a": 10}) + a = root.create_array( + "a", shape=[6, 7], chunks=[4, 5], dtype="uint8", compressors=None + ) + a[...] = np.arange(np.prod(a.shape), dtype=a.dtype).reshape(a.shape) + root.create_array("bar", shape=[6, 7], chunks=[4, 5], dtype="int32") + c = root.create_group("cde", attributes={"b": 11}) + c.create_array("abc", shape=[6, 7], chunks=[4, 5], dtype="int32") + c.create_array("def", shape=[6, 7], chunks=[4, 5], dtype="int32") + root.create_array("def", shape=[6, 7], chunks=[4, 5], dtype="int32") + root.create_group("e", attributes={"b": 11}) + c.create_array("xyz", shape=[6, 7], chunks=[4, 5], dtype="int32") + + session.commit("first commit") + + +def copy_to_dir(name, output_name): + storage_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + output_dir = os.path.join(SCRIPT_DIR, output_name) + shutil.rmtree(output_dir, ignore_errors=True) + storage = icechunk.local_filesystem_storage(storage_dir) + repo = icechunk.Repository.open(storage) + read_session = repo.readonly_session(branch="main") + store = read_session.store + + async def do_copy(): + buffer_prototype = zarr.core.buffer.default_buffer_prototype() + async for key in store.list(): + value = (await store.get(key, prototype=buffer_prototype)).to_bytes() + if key.endswith("zarr.json"): + # icechunk incorrectly includes `"dimension_names": null` fields. + # https://github.com/earth-mover/icechunk/issues/706 + j = json.loads(value) + if "dimension_names" in j and j["dimension_names"] is None: + del j["dimension_names"] + value = json.dumps(j).encode("utf-8") + output_path = os.path.join(output_dir, key) + os.makedirs(os.path.dirname(output_path), exist_ok=True) + pathlib.Path(output_path).write_bytes(value) + + asyncio.run(do_copy()) + + +def write_virtual_ref_test(name): + storage_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + shutil.rmtree(storage_dir, ignore_errors=True) + storage = icechunk.local_filesystem_storage(storage_dir) + + repo = icechunk.Repository.create(storage) + + session = repo.writable_session("main") + + zarr.create( + shape=[4, 5], + chunks=[4, 5], + dtype="uint8", + store=session.store, + compressor=None, + ) + session.store.set_virtual_ref( + "c/0/0", "s3://mybucket/myobject", offset=5, length=20 + ) + + session.commit("first commit") + + +write_zarr_array("single_array.icechunk") +write_zarr_hierarchy("hierarchy.icechunk") +for name in ["single_array", "hierarchy"]: + copy_to_dir(f"{name}.icechunk", name) +write_virtual_ref_test("virtual_ref.icechunk") diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/manifests/MVWAQ73BGST9RW6RMFXG b/testdata/kvstore/icechunk/hierarchy.icechunk/manifests/MVWAQ73BGST9RW6RMFXG new file mode 100644 index 0000000000..14da72568e Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy.icechunk/manifests/MVWAQ73BGST9RW6RMFXG differ diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZY.json b/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZY.json new file mode 100644 index 0000000000..35ca75c168 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZY.json @@ -0,0 +1 @@ +{"snapshot":"XZD2C6JMQQN401V62Q1G"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZZ.json b/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZZ.json new file mode 100644 index 0000000000..220bd15e3e --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy.icechunk/refs/branch.main/ZZZZZZZZ.json @@ -0,0 +1 @@ +{"snapshot":"1HZ42NF5G8EE447613T0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/1HZ42NF5G8EE447613T0 b/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/1HZ42NF5G8EE447613T0 new file mode 100644 index 0000000000..1eccb0c12d Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/1HZ42NF5G8EE447613T0 differ diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/XZD2C6JMQQN401V62Q1G b/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/XZD2C6JMQQN401V62Q1G new file mode 100644 index 0000000000..cac278d23c Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy.icechunk/snapshots/XZD2C6JMQQN401V62Q1G differ diff --git a/testdata/kvstore/icechunk/hierarchy.icechunk/transactions/XZD2C6JMQQN401V62Q1G b/testdata/kvstore/icechunk/hierarchy.icechunk/transactions/XZD2C6JMQQN401V62Q1G new file mode 100644 index 0000000000..ad25ea8e58 Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy.icechunk/transactions/XZD2C6JMQQN401V62Q1G differ diff --git a/testdata/kvstore/icechunk/hierarchy/a/c/0/0 b/testdata/kvstore/icechunk/hierarchy/a/c/0/0 new file mode 100644 index 0000000000..2717fedea2 Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy/a/c/0/0 differ diff --git a/testdata/kvstore/icechunk/hierarchy/a/c/0/1 b/testdata/kvstore/icechunk/hierarchy/a/c/0/1 new file mode 100644 index 0000000000..6bd993ba71 Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy/a/c/0/1 differ diff --git a/testdata/kvstore/icechunk/hierarchy/a/c/1/0 b/testdata/kvstore/icechunk/hierarchy/a/c/1/0 new file mode 100644 index 0000000000..61d3f90480 Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy/a/c/1/0 differ diff --git a/testdata/kvstore/icechunk/hierarchy/a/c/1/1 b/testdata/kvstore/icechunk/hierarchy/a/c/1/1 new file mode 100644 index 0000000000..4e6c9a595a Binary files /dev/null and b/testdata/kvstore/icechunk/hierarchy/a/c/1/1 differ diff --git a/testdata/kvstore/icechunk/hierarchy/a/zarr.json b/testdata/kvstore/icechunk/hierarchy/a/zarr.json new file mode 100644 index 0000000000..0003a996ed --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/a/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "uint8", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/bar/zarr.json b/testdata/kvstore/icechunk/hierarchy/bar/zarr.json new file mode 100644 index 0000000000..45e3910296 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/bar/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "int32", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"checksum": false, "level": 0}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/cde/abc/zarr.json b/testdata/kvstore/icechunk/hierarchy/cde/abc/zarr.json new file mode 100644 index 0000000000..45e3910296 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/cde/abc/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "int32", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"checksum": false, "level": 0}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/cde/def/zarr.json b/testdata/kvstore/icechunk/hierarchy/cde/def/zarr.json new file mode 100644 index 0000000000..0f9295c8be --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/cde/def/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "int32", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"level": 0, "checksum": false}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/cde/xyz/zarr.json b/testdata/kvstore/icechunk/hierarchy/cde/xyz/zarr.json new file mode 100644 index 0000000000..0f9295c8be --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/cde/xyz/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "int32", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"level": 0, "checksum": false}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/cde/zarr.json b/testdata/kvstore/icechunk/hierarchy/cde/zarr.json new file mode 100644 index 0000000000..b0555bb118 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/cde/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "group", "attributes": {"b": 11}} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/def/zarr.json b/testdata/kvstore/icechunk/hierarchy/def/zarr.json new file mode 100644 index 0000000000..0f9295c8be --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/def/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "int32", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"level": 0, "checksum": false}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/e/zarr.json b/testdata/kvstore/icechunk/hierarchy/e/zarr.json new file mode 100644 index 0000000000..b0555bb118 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/e/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "group", "attributes": {"b": 11}} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/hierarchy/zarr.json b/testdata/kvstore/icechunk/hierarchy/zarr.json new file mode 100644 index 0000000000..f18f764a58 --- /dev/null +++ b/testdata/kvstore/icechunk/hierarchy/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "group", "attributes": {"a": 10}} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/manifests/4SJZWP0KQ215CKGSPAJG b/testdata/kvstore/icechunk/single_array.icechunk/manifests/4SJZWP0KQ215CKGSPAJG new file mode 100644 index 0000000000..85c3f3efcd Binary files /dev/null and b/testdata/kvstore/icechunk/single_array.icechunk/manifests/4SJZWP0KQ215CKGSPAJG differ diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZY.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZY.json new file mode 100644 index 0000000000..8b1929d1ce --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZY.json @@ -0,0 +1 @@ +{"snapshot":"K85ER2WWGSGYGXW0GJC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZZ.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZZ.json new file mode 100644 index 0000000000..d91730a936 --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.main/ZZZZZZZZ.json @@ -0,0 +1 @@ +{"snapshot":"FWWFQGAW742XMX0F5MF0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.other_branch/ZZZZZZZZ.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.other_branch/ZZZZZZZZ.json new file mode 100644 index 0000000000..8b1929d1ce --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/branch.other_branch/ZZZZZZZZ.json @@ -0,0 +1 @@ +{"snapshot":"K85ER2WWGSGYGXW0GJC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag1/ref.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag1/ref.json new file mode 100644 index 0000000000..8b1929d1ce --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag1/ref.json @@ -0,0 +1 @@ +{"snapshot":"K85ER2WWGSGYGXW0GJC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag2/ref.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag2/ref.json new file mode 100644 index 0000000000..8b1929d1ce --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag2/ref.json @@ -0,0 +1 @@ +{"snapshot":"K85ER2WWGSGYGXW0GJC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag3/ref.json b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag3/ref.json new file mode 100644 index 0000000000..8b1929d1ce --- /dev/null +++ b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag3/ref.json @@ -0,0 +1 @@ +{"snapshot":"K85ER2WWGSGYGXW0GJC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag3/ref.json.deleted b/testdata/kvstore/icechunk/single_array.icechunk/refs/tag.tag3/ref.json.deleted new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testdata/kvstore/icechunk/single_array.icechunk/snapshots/FWWFQGAW742XMX0F5MF0 b/testdata/kvstore/icechunk/single_array.icechunk/snapshots/FWWFQGAW742XMX0F5MF0 new file mode 100644 index 0000000000..d7fc7c4904 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array.icechunk/snapshots/FWWFQGAW742XMX0F5MF0 differ diff --git a/testdata/kvstore/icechunk/single_array.icechunk/snapshots/K85ER2WWGSGYGXW0GJC0 b/testdata/kvstore/icechunk/single_array.icechunk/snapshots/K85ER2WWGSGYGXW0GJC0 new file mode 100644 index 0000000000..566705ed40 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array.icechunk/snapshots/K85ER2WWGSGYGXW0GJC0 differ diff --git a/testdata/kvstore/icechunk/single_array.icechunk/transactions/K85ER2WWGSGYGXW0GJC0 b/testdata/kvstore/icechunk/single_array.icechunk/transactions/K85ER2WWGSGYGXW0GJC0 new file mode 100644 index 0000000000..bc31819e61 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array.icechunk/transactions/K85ER2WWGSGYGXW0GJC0 differ diff --git a/testdata/kvstore/icechunk/single_array/c/0/0 b/testdata/kvstore/icechunk/single_array/c/0/0 new file mode 100644 index 0000000000..7c402c16d0 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array/c/0/0 differ diff --git a/testdata/kvstore/icechunk/single_array/c/0/1 b/testdata/kvstore/icechunk/single_array/c/0/1 new file mode 100644 index 0000000000..2b2202c4eb Binary files /dev/null and b/testdata/kvstore/icechunk/single_array/c/0/1 differ diff --git a/testdata/kvstore/icechunk/single_array/c/1/0 b/testdata/kvstore/icechunk/single_array/c/1/0 new file mode 100644 index 0000000000..adcd5bb491 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array/c/1/0 differ diff --git a/testdata/kvstore/icechunk/single_array/c/1/1 b/testdata/kvstore/icechunk/single_array/c/1/1 new file mode 100644 index 0000000000..2f886df148 Binary files /dev/null and b/testdata/kvstore/icechunk/single_array/c/1/1 differ diff --git a/testdata/kvstore/icechunk/single_array/zarr.json b/testdata/kvstore/icechunk/single_array/zarr.json new file mode 100644 index 0000000000..26e25bcb5d --- /dev/null +++ b/testdata/kvstore/icechunk/single_array/zarr.json @@ -0,0 +1 @@ +{"zarr_format": 3, "node_type": "array", "attributes": {}, "shape": [6, 7], "data_type": "uint8", "chunk_grid": {"name": "regular", "configuration": {"chunk_shape": [4, 5]}}, "chunk_key_encoding": {"name": "default", "configuration": {"separator": "/"}}, "fill_value": 0, "codecs": [{"name": "bytes", "configuration": {"endian": "little"}}, {"name": "zstd", "configuration": {"checksum": false, "level": 0}}], "storage_transformers": []} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/manifests/MTEE84YRHHVHA2MTQ9T0 b/testdata/kvstore/icechunk/virtual_ref.icechunk/manifests/MTEE84YRHHVHA2MTQ9T0 new file mode 100644 index 0000000000..8ce1e522d3 Binary files /dev/null and b/testdata/kvstore/icechunk/virtual_ref.icechunk/manifests/MTEE84YRHHVHA2MTQ9T0 differ diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZY.json b/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZY.json new file mode 100644 index 0000000000..9506f4494d --- /dev/null +++ b/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZY.json @@ -0,0 +1 @@ +{"snapshot":"PT4ERC0EXR44AP5FDKC0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZZ.json b/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZZ.json new file mode 100644 index 0000000000..9090db7851 --- /dev/null +++ b/testdata/kvstore/icechunk/virtual_ref.icechunk/refs/branch.main/ZZZZZZZZ.json @@ -0,0 +1 @@ +{"snapshot":"TE8JW5SJXGR0R8W27YV0"} \ No newline at end of file diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/PT4ERC0EXR44AP5FDKC0 b/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/PT4ERC0EXR44AP5FDKC0 new file mode 100644 index 0000000000..5bdf54e3de Binary files /dev/null and b/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/PT4ERC0EXR44AP5FDKC0 differ diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/TE8JW5SJXGR0R8W27YV0 b/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/TE8JW5SJXGR0R8W27YV0 new file mode 100644 index 0000000000..9d769616b7 Binary files /dev/null and b/testdata/kvstore/icechunk/virtual_ref.icechunk/snapshots/TE8JW5SJXGR0R8W27YV0 differ diff --git a/testdata/kvstore/icechunk/virtual_ref.icechunk/transactions/PT4ERC0EXR44AP5FDKC0 b/testdata/kvstore/icechunk/virtual_ref.icechunk/transactions/PT4ERC0EXR44AP5FDKC0 new file mode 100644 index 0000000000..8849b74a3c Binary files /dev/null and b/testdata/kvstore/icechunk/virtual_ref.icechunk/transactions/PT4ERC0EXR44AP5FDKC0 differ diff --git a/testdata/kvstore/ocdbt/files_high_arity.ocdbt/d/9b07a9a00a1a562b1c801f1d164a90c6 b/testdata/kvstore/ocdbt/files_high_arity.ocdbt/d/9b07a9a00a1a562b1c801f1d164a90c6 new file mode 100644 index 0000000000..8392845a02 Binary files /dev/null and b/testdata/kvstore/ocdbt/files_high_arity.ocdbt/d/9b07a9a00a1a562b1c801f1d164a90c6 differ diff --git a/testdata/kvstore/ocdbt/files_high_arity.ocdbt/manifest.ocdbt b/testdata/kvstore/ocdbt/files_high_arity.ocdbt/manifest.ocdbt new file mode 100644 index 0000000000..32e4de5a2e Binary files /dev/null and b/testdata/kvstore/ocdbt/files_high_arity.ocdbt/manifest.ocdbt differ diff --git a/testdata/kvstore/ocdbt/files_min_arity.ocdbt/d/f6d9da936d3f6f58b667ca9d54a38667 b/testdata/kvstore/ocdbt/files_min_arity.ocdbt/d/f6d9da936d3f6f58b667ca9d54a38667 new file mode 100644 index 0000000000..c964fb4017 Binary files /dev/null and b/testdata/kvstore/ocdbt/files_min_arity.ocdbt/d/f6d9da936d3f6f58b667ca9d54a38667 differ diff --git a/testdata/kvstore/ocdbt/files_min_arity.ocdbt/manifest.ocdbt b/testdata/kvstore/ocdbt/files_min_arity.ocdbt/manifest.ocdbt new file mode 100644 index 0000000000..634983748a Binary files /dev/null and b/testdata/kvstore/ocdbt/files_min_arity.ocdbt/manifest.ocdbt differ diff --git a/testdata/kvstore/ocdbt/generate_ocdbt.py b/testdata/kvstore/ocdbt/generate_ocdbt.py new file mode 100755 index 0000000000..32ebae6bfa --- /dev/null +++ b/testdata/kvstore/ocdbt/generate_ocdbt.py @@ -0,0 +1,77 @@ +#!/usr/bin/env -S uv run --script +# /// script +# requires-python = ">=3.11" +# dependencies = [ +# "tensorstore", +# ] +# /// + +import os +import pathlib +import shutil + +import tensorstore as ts + +SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def write_ocdbt_files(name, config): + print(name) + files_dir = os.path.abspath(os.path.join(SCRIPT_DIR, "..", "files")) + ocdbt_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + + shutil.rmtree(ocdbt_dir, ignore_errors=True) + + kvs = ts.KvStore.open( + { + "driver": "ocdbt", + "base": {"driver": "file", "path": ocdbt_dir}, + "assume_config": True, + "config": config, + } + ).result() + + with ts.Transaction(atomic=True) as txn: + for root, dirs, files in os.walk(files_dir): + for filename in files: + entry_path = os.path.join(root, filename) + kvs.with_transaction(txn)[os.path.relpath(entry_path, files_dir)] = ( + pathlib.Path(entry_path).read_bytes() + ) + + print(ts.ocdbt.dump(kvs.base).result()) + + +def write_ocdbt_multi_version(name: str, config, num_versions: int): + ocdbt_dir = os.path.abspath(os.path.join(SCRIPT_DIR, name)) + + shutil.rmtree(ocdbt_dir, ignore_errors=True) + + kvs = ts.KvStore.open( + { + "driver": "ocdbt", + "base": {"driver": "file", "path": ocdbt_dir}, + "assume_config": True, + "config": config, + } + ).result() + + for i in range(1, num_versions + 1): + with ts.Transaction(atomic=True) as txn: + kvs.with_transaction(txn)[f"key{i}"] = f"version {i}" + print(ts.ocdbt.dump(kvs.base).result()) + + +write_ocdbt_files(name="files_high_arity.ocdbt", config={}) +write_ocdbt_files( + name="files_min_arity.ocdbt", + config={"max_inline_value_bytes": 2, "max_decoded_node_bytes": 1}, +) +write_ocdbt_multi_version( + name="multi_version_high_arity.ocdbt", config={}, num_versions=200 +) +write_ocdbt_multi_version( + name="multi_version_low_arity.ocdbt", + config={"version_tree_arity_log2": 1}, + num_versions=200, +) diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/011bf982d34d61c6d1bfa1c130bee54b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/011bf982d34d61c6d1bfa1c130bee54b new file mode 100644 index 0000000000..8091bfccf6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/011bf982d34d61c6d1bfa1c130bee54b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0256951fa78c6f2747da5ede302136bd b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0256951fa78c6f2747da5ede302136bd new file mode 100644 index 0000000000..94eef451f2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0256951fa78c6f2747da5ede302136bd differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/02fee8f7603d1be75c7fcad4ccfb5350 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/02fee8f7603d1be75c7fcad4ccfb5350 new file mode 100644 index 0000000000..7657715643 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/02fee8f7603d1be75c7fcad4ccfb5350 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/032377d380464fc315000308c69adbed b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/032377d380464fc315000308c69adbed new file mode 100644 index 0000000000..05ecb27111 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/032377d380464fc315000308c69adbed differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/04d5d7f8d3c3085814456a5f0f0af3f5 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/04d5d7f8d3c3085814456a5f0f0af3f5 new file mode 100644 index 0000000000..3a0ec707e7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/04d5d7f8d3c3085814456a5f0f0af3f5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/06d6fbcbb31ee6612ce57f8bc1223f2f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/06d6fbcbb31ee6612ce57f8bc1223f2f new file mode 100644 index 0000000000..7f36d2f51c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/06d6fbcbb31ee6612ce57f8bc1223f2f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/08730d048ac0b296b9a018151c2920a3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/08730d048ac0b296b9a018151c2920a3 new file mode 100644 index 0000000000..4d627ba589 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/08730d048ac0b296b9a018151c2920a3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0892972bcbdaea22fbc5dfef8d0110e1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0892972bcbdaea22fbc5dfef8d0110e1 new file mode 100644 index 0000000000..367c9a7fda Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0892972bcbdaea22fbc5dfef8d0110e1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/09c9e1b2441141b0e37635499e13cb46 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/09c9e1b2441141b0e37635499e13cb46 new file mode 100644 index 0000000000..045c45bfe8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/09c9e1b2441141b0e37635499e13cb46 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0d0510ba572a1375dc037fc1629e2fe1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0d0510ba572a1375dc037fc1629e2fe1 new file mode 100644 index 0000000000..b3ffda7495 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0d0510ba572a1375dc037fc1629e2fe1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0f7f5ea31b624b86927ec59553efd7f8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0f7f5ea31b624b86927ec59553efd7f8 new file mode 100644 index 0000000000..f987ab3c54 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/0f7f5ea31b624b86927ec59553efd7f8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/107038ba80a1d96e19071c3b781ad870 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/107038ba80a1d96e19071c3b781ad870 new file mode 100644 index 0000000000..46d4724a94 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/107038ba80a1d96e19071c3b781ad870 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1333397cd401ec2fde80f7d0d5e4c348 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1333397cd401ec2fde80f7d0d5e4c348 new file mode 100644 index 0000000000..72f51fa869 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1333397cd401ec2fde80f7d0d5e4c348 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/13501d0d669d586a702b9737c5193ce4 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/13501d0d669d586a702b9737c5193ce4 new file mode 100644 index 0000000000..c265839448 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/13501d0d669d586a702b9737c5193ce4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/15c2271f560b20da49c9f2164ed5f3e0 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/15c2271f560b20da49c9f2164ed5f3e0 new file mode 100644 index 0000000000..4b81c6cc9c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/15c2271f560b20da49c9f2164ed5f3e0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/161fdb198401da2961a36f62e3ee39d9 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/161fdb198401da2961a36f62e3ee39d9 new file mode 100644 index 0000000000..7eeba39eba Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/161fdb198401da2961a36f62e3ee39d9 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/167ad3c3ea37b826fc87fac55bcb1a9f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/167ad3c3ea37b826fc87fac55bcb1a9f new file mode 100644 index 0000000000..140add8e36 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/167ad3c3ea37b826fc87fac55bcb1a9f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17d1debfec0367ce7096d1495236be67 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17d1debfec0367ce7096d1495236be67 new file mode 100644 index 0000000000..2b6aff4452 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17d1debfec0367ce7096d1495236be67 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17ed617dcd48e951be8d862ae646e9dc b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17ed617dcd48e951be8d862ae646e9dc new file mode 100644 index 0000000000..1046a842c2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/17ed617dcd48e951be8d862ae646e9dc differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/18dc8ba893735c0dfa947d3d26b94921 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/18dc8ba893735c0dfa947d3d26b94921 new file mode 100644 index 0000000000..bb26f8a08d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/18dc8ba893735c0dfa947d3d26b94921 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1936a90b4d26d6a9fbdd7f8552c6c794 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1936a90b4d26d6a9fbdd7f8552c6c794 new file mode 100644 index 0000000000..c773226818 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1936a90b4d26d6a9fbdd7f8552c6c794 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/199ee97b2f7e6fdb7afd7a5d0e2168a5 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/199ee97b2f7e6fdb7afd7a5d0e2168a5 new file mode 100644 index 0000000000..e9daa9b3db Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/199ee97b2f7e6fdb7afd7a5d0e2168a5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1bbe376b3be9712b7a18477f91a886be b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1bbe376b3be9712b7a18477f91a886be new file mode 100644 index 0000000000..b1a4ec40fa Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1bbe376b3be9712b7a18477f91a886be differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c78db9903a860e2326be6d22b9cf9ec b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c78db9903a860e2326be6d22b9cf9ec new file mode 100644 index 0000000000..d22c7226a7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c78db9903a860e2326be6d22b9cf9ec differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c9d62cbf3029404551df6cc2d38d020 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c9d62cbf3029404551df6cc2d38d020 new file mode 100644 index 0000000000..d5a492c3f3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1c9d62cbf3029404551df6cc2d38d020 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1d89b6bd8f0f55faaa204503e883a56f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1d89b6bd8f0f55faaa204503e883a56f new file mode 100644 index 0000000000..8b9075878a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/1d89b6bd8f0f55faaa204503e883a56f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/211151d7c70a45f354ff10335dfbc3d3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/211151d7c70a45f354ff10335dfbc3d3 new file mode 100644 index 0000000000..4a1555202d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/211151d7c70a45f354ff10335dfbc3d3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/222f25099330450a8afd0ba914fa297a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/222f25099330450a8afd0ba914fa297a new file mode 100644 index 0000000000..70ab4efa04 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/222f25099330450a8afd0ba914fa297a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/231902cf4246957bf629197436661edb b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/231902cf4246957bf629197436661edb new file mode 100644 index 0000000000..7fbbf0f5e4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/231902cf4246957bf629197436661edb differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/23196717bf1fcda4431f609f2d48bf29 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/23196717bf1fcda4431f609f2d48bf29 new file mode 100644 index 0000000000..21cc575369 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/23196717bf1fcda4431f609f2d48bf29 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/24b95818ea4ab9691eca08828121e1f3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/24b95818ea4ab9691eca08828121e1f3 new file mode 100644 index 0000000000..9ac18cbf16 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/24b95818ea4ab9691eca08828121e1f3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2703e63e95de898783a7489076c25c1a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2703e63e95de898783a7489076c25c1a new file mode 100644 index 0000000000..99ea1eda52 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2703e63e95de898783a7489076c25c1a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/27aae02348169dd89869fabc877d1d7e b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/27aae02348169dd89869fabc877d1d7e new file mode 100644 index 0000000000..7d33fd8933 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/27aae02348169dd89869fabc877d1d7e differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a39c910b07b75978cd6b7881bea8f40 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a39c910b07b75978cd6b7881bea8f40 new file mode 100644 index 0000000000..11aa706eff Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a39c910b07b75978cd6b7881bea8f40 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a6acfceeeda776e8f776520b61ac1a5 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a6acfceeeda776e8f776520b61ac1a5 new file mode 100644 index 0000000000..a67dafcd80 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2a6acfceeeda776e8f776520b61ac1a5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2cd9be986d46595584a36351ff95a1e4 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2cd9be986d46595584a36351ff95a1e4 new file mode 100644 index 0000000000..eaabd9b47f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2cd9be986d46595584a36351ff95a1e4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2e59093fb8416cf587f3d266a007e295 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2e59093fb8416cf587f3d266a007e295 new file mode 100644 index 0000000000..a3ce29fd32 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2e59093fb8416cf587f3d266a007e295 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2f9038d8496cde6ae1a050e8c5c69b0d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2f9038d8496cde6ae1a050e8c5c69b0d new file mode 100644 index 0000000000..0d600075a3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/2f9038d8496cde6ae1a050e8c5c69b0d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/33ee55bb4874d86e5269c22ef30de175 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/33ee55bb4874d86e5269c22ef30de175 new file mode 100644 index 0000000000..3a2b04185e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/33ee55bb4874d86e5269c22ef30de175 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344331c617fa18ef69c96554475cc881 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344331c617fa18ef69c96554475cc881 new file mode 100644 index 0000000000..fe1b3b6385 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344331c617fa18ef69c96554475cc881 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344f5ad4890a841ee9eb669f01da4622 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344f5ad4890a841ee9eb669f01da4622 new file mode 100644 index 0000000000..73c7d4e0e8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/344f5ad4890a841ee9eb669f01da4622 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3810a5789859540f61e2da728f087b3a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3810a5789859540f61e2da728f087b3a new file mode 100644 index 0000000000..a097866093 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3810a5789859540f61e2da728f087b3a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/38aedfef59c6921fa8f1719d1ccb695c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/38aedfef59c6921fa8f1719d1ccb695c new file mode 100644 index 0000000000..97faf25d43 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/38aedfef59c6921fa8f1719d1ccb695c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3a4e72f311becc51bbe4f3c11950b1c1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3a4e72f311becc51bbe4f3c11950b1c1 new file mode 100644 index 0000000000..99d76d24ad Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3a4e72f311becc51bbe4f3c11950b1c1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3da9782a259b6951bfb6c404b6368a81 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3da9782a259b6951bfb6c404b6368a81 new file mode 100644 index 0000000000..f12b136b68 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3da9782a259b6951bfb6c404b6368a81 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3e052cf1869677c6e4be8e19d8593537 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3e052cf1869677c6e4be8e19d8593537 new file mode 100644 index 0000000000..a193d2184e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3e052cf1869677c6e4be8e19d8593537 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f0aaacbff7148c68f8bce7b755a4355 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f0aaacbff7148c68f8bce7b755a4355 new file mode 100644 index 0000000000..0452e38421 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f0aaacbff7148c68f8bce7b755a4355 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f8bc38284bb641e77f3a39858206279 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f8bc38284bb641e77f3a39858206279 new file mode 100644 index 0000000000..9cfc4a2d11 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/3f8bc38284bb641e77f3a39858206279 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40360af4885eaba10393b5e13896e058 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40360af4885eaba10393b5e13896e058 new file mode 100644 index 0000000000..bb576900a3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40360af4885eaba10393b5e13896e058 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/408b8539a314150648de69a4ad9fa10d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/408b8539a314150648de69a4ad9fa10d new file mode 100644 index 0000000000..d0f736b945 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/408b8539a314150648de69a4ad9fa10d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c41c74b5f729828aa07b80a00bc1c6 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c41c74b5f729828aa07b80a00bc1c6 new file mode 100644 index 0000000000..ec7a963f1d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c41c74b5f729828aa07b80a00bc1c6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c5523a4096a2b5980955b05751a5e8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c5523a4096a2b5980955b05751a5e8 new file mode 100644 index 0000000000..3498390ace Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40c5523a4096a2b5980955b05751a5e8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40f3a94bb055a8bab3dc3fc7d60c2703 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40f3a94bb055a8bab3dc3fc7d60c2703 new file mode 100644 index 0000000000..bd64d27157 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/40f3a94bb055a8bab3dc3fc7d60c2703 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41b74a39ea82983c9744c9b6f7ee5130 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41b74a39ea82983c9744c9b6f7ee5130 new file mode 100644 index 0000000000..5696863a25 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41b74a39ea82983c9744c9b6f7ee5130 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41eae4e11c6951c5a1ad37c135d4bc6d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41eae4e11c6951c5a1ad37c135d4bc6d new file mode 100644 index 0000000000..50877f514c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/41eae4e11c6951c5a1ad37c135d4bc6d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/42577642aced385e156ddbbd2e5eecf7 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/42577642aced385e156ddbbd2e5eecf7 new file mode 100644 index 0000000000..e2ac5876bc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/42577642aced385e156ddbbd2e5eecf7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4387de4e00b7f03d6052124095ce304b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4387de4e00b7f03d6052124095ce304b new file mode 100644 index 0000000000..3a9631457c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4387de4e00b7f03d6052124095ce304b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/442ed0908523183490a55e8643613b29 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/442ed0908523183490a55e8643613b29 new file mode 100644 index 0000000000..18a5c24792 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/442ed0908523183490a55e8643613b29 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/449b877f56daee0acd8b4b1e53579ae7 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/449b877f56daee0acd8b4b1e53579ae7 new file mode 100644 index 0000000000..68e43379a4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/449b877f56daee0acd8b4b1e53579ae7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45de5762ce12dc0a5dc79a73c4a57b7a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45de5762ce12dc0a5dc79a73c4a57b7a new file mode 100644 index 0000000000..b0d3a0001f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45de5762ce12dc0a5dc79a73c4a57b7a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45ed45d31e7c05616f42e8dca49ae69d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45ed45d31e7c05616f42e8dca49ae69d new file mode 100644 index 0000000000..52a7f77d3b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/45ed45d31e7c05616f42e8dca49ae69d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/47cb983b82c32639cd3b8f6b4c08233c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/47cb983b82c32639cd3b8f6b4c08233c new file mode 100644 index 0000000000..92526cd5ac Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/47cb983b82c32639cd3b8f6b4c08233c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/49493b2fc1f4f5257b999cc65c086e9c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/49493b2fc1f4f5257b999cc65c086e9c new file mode 100644 index 0000000000..cf91c3c288 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/49493b2fc1f4f5257b999cc65c086e9c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4abfafe5e1cb3d094fff015bae5e6b8f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4abfafe5e1cb3d094fff015bae5e6b8f new file mode 100644 index 0000000000..8a154b073e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4abfafe5e1cb3d094fff015bae5e6b8f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b2727c3a3cfe2b4d57f3dc9a55ce436 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b2727c3a3cfe2b4d57f3dc9a55ce436 new file mode 100644 index 0000000000..8bab4f1d3c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b2727c3a3cfe2b4d57f3dc9a55ce436 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b5ca8c7e30b721568e89ef6a8b3c893 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b5ca8c7e30b721568e89ef6a8b3c893 new file mode 100644 index 0000000000..f84374ba31 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4b5ca8c7e30b721568e89ef6a8b3c893 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4c0057729ee7cbff6cf94115163e49f6 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4c0057729ee7cbff6cf94115163e49f6 new file mode 100644 index 0000000000..5f66242a22 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4c0057729ee7cbff6cf94115163e49f6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4e600a8346029e71576191ead3d3916c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4e600a8346029e71576191ead3d3916c new file mode 100644 index 0000000000..813d34d3a1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4e600a8346029e71576191ead3d3916c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4f50c935ea06fdd7b4f530f36cd6f911 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4f50c935ea06fdd7b4f530f36cd6f911 new file mode 100644 index 0000000000..11d9b74cc6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/4f50c935ea06fdd7b4f530f36cd6f911 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55c69d071bc5f0686e08678ec34f5d8e b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55c69d071bc5f0686e08678ec34f5d8e new file mode 100644 index 0000000000..3b059af530 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55c69d071bc5f0686e08678ec34f5d8e differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55dec36bde1eef656c0082c0e6c18616 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55dec36bde1eef656c0082c0e6c18616 new file mode 100644 index 0000000000..5aa08c4b01 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/55dec36bde1eef656c0082c0e6c18616 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/57bada9093847511605d5520511d889e b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/57bada9093847511605d5520511d889e new file mode 100644 index 0000000000..f810119f91 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/57bada9093847511605d5520511d889e differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/580cc2b0dc24994742ebaf8dc58be032 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/580cc2b0dc24994742ebaf8dc58be032 new file mode 100644 index 0000000000..8322f4d06b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/580cc2b0dc24994742ebaf8dc58be032 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/581611b1e2246c81383e73b7f176231c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/581611b1e2246c81383e73b7f176231c new file mode 100644 index 0000000000..06b2a31b64 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/581611b1e2246c81383e73b7f176231c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/592d44d87f583ed44d5b6e3a01e2507d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/592d44d87f583ed44d5b6e3a01e2507d new file mode 100644 index 0000000000..a9fcdfcee8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/592d44d87f583ed44d5b6e3a01e2507d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/597c4c203d80f6b1bb111aca98c65cd3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/597c4c203d80f6b1bb111aca98c65cd3 new file mode 100644 index 0000000000..4a334064bd Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/597c4c203d80f6b1bb111aca98c65cd3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5a1ffc7b3b808b46f2aa141584aa839b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5a1ffc7b3b808b46f2aa141584aa839b new file mode 100644 index 0000000000..0c5a5a4abc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5a1ffc7b3b808b46f2aa141584aa839b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5c99d94d4ae780bee5db812db52c4c95 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5c99d94d4ae780bee5db812db52c4c95 new file mode 100644 index 0000000000..3cb1544486 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5c99d94d4ae780bee5db812db52c4c95 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5cda984fddfabbf7f3dbad333fdc2661 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5cda984fddfabbf7f3dbad333fdc2661 new file mode 100644 index 0000000000..d5efeb7925 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5cda984fddfabbf7f3dbad333fdc2661 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5e7974f1271a5698629de1dbd85828ef b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5e7974f1271a5698629de1dbd85828ef new file mode 100644 index 0000000000..679a07e724 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5e7974f1271a5698629de1dbd85828ef differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5ec10a6abb460b08a7e3a533bbaa26ce b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5ec10a6abb460b08a7e3a533bbaa26ce new file mode 100644 index 0000000000..4a4cccbaa9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/5ec10a6abb460b08a7e3a533bbaa26ce differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/634e440fff4ead68292fe96b0ffc5b5c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/634e440fff4ead68292fe96b0ffc5b5c new file mode 100644 index 0000000000..816a2eaa00 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/634e440fff4ead68292fe96b0ffc5b5c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6480b4cd9dbae2d5f5a88f9de8a641e3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6480b4cd9dbae2d5f5a88f9de8a641e3 new file mode 100644 index 0000000000..83f1891bcd Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6480b4cd9dbae2d5f5a88f9de8a641e3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65bdb609b84f00e0a8c14938d1593ab0 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65bdb609b84f00e0a8c14938d1593ab0 new file mode 100644 index 0000000000..f7b2555ed8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65bdb609b84f00e0a8c14938d1593ab0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65eb60ac29092aa404543ebd623e4d8f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65eb60ac29092aa404543ebd623e4d8f new file mode 100644 index 0000000000..df93bb2429 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/65eb60ac29092aa404543ebd623e4d8f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/66fa94c3c4ca12fcc92a81e31d4db780 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/66fa94c3c4ca12fcc92a81e31d4db780 new file mode 100644 index 0000000000..a9c4b94b7b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/66fa94c3c4ca12fcc92a81e31d4db780 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6904d8ed1aa8fe04dedf44d0e99d433a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6904d8ed1aa8fe04dedf44d0e99d433a new file mode 100644 index 0000000000..2de1e74b8b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6904d8ed1aa8fe04dedf44d0e99d433a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6a5da431a8fbb21425660251cc3d4696 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6a5da431a8fbb21425660251cc3d4696 new file mode 100644 index 0000000000..15f57fda8f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6a5da431a8fbb21425660251cc3d4696 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6ca22cff258eeb54e180feab1abc7471 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6ca22cff258eeb54e180feab1abc7471 new file mode 100644 index 0000000000..72002f9b50 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6ca22cff258eeb54e180feab1abc7471 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6daaf6e369d97b9a274619fd27796c81 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6daaf6e369d97b9a274619fd27796c81 new file mode 100644 index 0000000000..4302263772 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6daaf6e369d97b9a274619fd27796c81 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6eb02573b0fb0def25af38311d53197f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6eb02573b0fb0def25af38311d53197f new file mode 100644 index 0000000000..53bcbd3e05 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6eb02573b0fb0def25af38311d53197f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6f56c68bfe3df8ca92513ed6b74390c8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6f56c68bfe3df8ca92513ed6b74390c8 new file mode 100644 index 0000000000..f44bb05ba3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/6f56c68bfe3df8ca92513ed6b74390c8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/72e3d6d3b9d288b633d523dafbffa095 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/72e3d6d3b9d288b633d523dafbffa095 new file mode 100644 index 0000000000..a2c7f7f298 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/72e3d6d3b9d288b633d523dafbffa095 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/756fbf694143bef7eb6f67a2001a9070 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/756fbf694143bef7eb6f67a2001a9070 new file mode 100644 index 0000000000..0fb402b093 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/756fbf694143bef7eb6f67a2001a9070 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7687c7ed11581194a023f020a7a14729 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7687c7ed11581194a023f020a7a14729 new file mode 100644 index 0000000000..a92a18a405 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7687c7ed11581194a023f020a7a14729 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7854a4726b03eb24901602af50c1a397 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7854a4726b03eb24901602af50c1a397 new file mode 100644 index 0000000000..f83ac14b9f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7854a4726b03eb24901602af50c1a397 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/78ea58af0eabebef52a5dd5801357f12 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/78ea58af0eabebef52a5dd5801357f12 new file mode 100644 index 0000000000..2f642d129b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/78ea58af0eabebef52a5dd5801357f12 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7a23e40aa62958c007ee3c8a98f9b62b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7a23e40aa62958c007ee3c8a98f9b62b new file mode 100644 index 0000000000..2d221a6ac0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7a23e40aa62958c007ee3c8a98f9b62b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7c48310e32de42cb8818b871e8be2901 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7c48310e32de42cb8818b871e8be2901 new file mode 100644 index 0000000000..f60963cecb Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7c48310e32de42cb8818b871e8be2901 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7d7249608eff5d16d02d111ab0e462ca b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7d7249608eff5d16d02d111ab0e462ca new file mode 100644 index 0000000000..399ffa7989 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7d7249608eff5d16d02d111ab0e462ca differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7de0b95e697ec036623583265bf67030 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7de0b95e697ec036623583265bf67030 new file mode 100644 index 0000000000..8d5eb121ac Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7de0b95e697ec036623583265bf67030 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7ecddd21423a5292164611c9a0ccf8e1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7ecddd21423a5292164611c9a0ccf8e1 new file mode 100644 index 0000000000..9b6d739c1b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7ecddd21423a5292164611c9a0ccf8e1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7fec6fcdbb4ca3d2b70bfa69a33b81ef b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7fec6fcdbb4ca3d2b70bfa69a33b81ef new file mode 100644 index 0000000000..9c750ff5f4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/7fec6fcdbb4ca3d2b70bfa69a33b81ef differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/80565d2b001bffec2b1c80383ac0568f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/80565d2b001bffec2b1c80383ac0568f new file mode 100644 index 0000000000..041c06e317 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/80565d2b001bffec2b1c80383ac0568f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/808bd41a2de9e9af3e1d36d94f99c942 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/808bd41a2de9e9af3e1d36d94f99c942 new file mode 100644 index 0000000000..6fde186716 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/808bd41a2de9e9af3e1d36d94f99c942 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/820a7836076acfc8cdbd5c4dd6035b07 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/820a7836076acfc8cdbd5c4dd6035b07 new file mode 100644 index 0000000000..0d8057c7ce Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/820a7836076acfc8cdbd5c4dd6035b07 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8363473e5d9a25df9f229d926eda737c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8363473e5d9a25df9f229d926eda737c new file mode 100644 index 0000000000..392f56fe1e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8363473e5d9a25df9f229d926eda737c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84cb3a9a455b5d05dea1d897eb8189b0 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84cb3a9a455b5d05dea1d897eb8189b0 new file mode 100644 index 0000000000..d2f54e98d5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84cb3a9a455b5d05dea1d897eb8189b0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84f37cc141bd03b3fe8de8d2516282d1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84f37cc141bd03b3fe8de8d2516282d1 new file mode 100644 index 0000000000..a32fd69b8b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/84f37cc141bd03b3fe8de8d2516282d1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/862425ff3e3d981b504123609116608b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/862425ff3e3d981b504123609116608b new file mode 100644 index 0000000000..695ae92234 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/862425ff3e3d981b504123609116608b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86778dca5e9b21ebf9ce4aa177d8e763 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86778dca5e9b21ebf9ce4aa177d8e763 new file mode 100644 index 0000000000..526fdf9aec Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86778dca5e9b21ebf9ce4aa177d8e763 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86a27adc64bac9922ac35979f3f054a4 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86a27adc64bac9922ac35979f3f054a4 new file mode 100644 index 0000000000..c5ac4ba161 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86a27adc64bac9922ac35979f3f054a4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86d1745251513daaa230a7ac77cd4da3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86d1745251513daaa230a7ac77cd4da3 new file mode 100644 index 0000000000..7b4f9450cb Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/86d1745251513daaa230a7ac77cd4da3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/87a7eb7eeeed89ad2d3ec3bcc48034f5 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/87a7eb7eeeed89ad2d3ec3bcc48034f5 new file mode 100644 index 0000000000..210c12550e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/87a7eb7eeeed89ad2d3ec3bcc48034f5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8e0a435c81a8d74c6283dfac003ed356 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8e0a435c81a8d74c6283dfac003ed356 new file mode 100644 index 0000000000..3569dbe2c7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8e0a435c81a8d74c6283dfac003ed356 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8fafd42dc4a2528f02608a5831bececa b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8fafd42dc4a2528f02608a5831bececa new file mode 100644 index 0000000000..85c9a2bbe9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/8fafd42dc4a2528f02608a5831bececa differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9221ad544e2b24b53df7e00d65b4e356 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9221ad544e2b24b53df7e00d65b4e356 new file mode 100644 index 0000000000..444bb83f4e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9221ad544e2b24b53df7e00d65b4e356 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/925d61624c813a70f55abb83c7f416d9 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/925d61624c813a70f55abb83c7f416d9 new file mode 100644 index 0000000000..9e2b00be0e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/925d61624c813a70f55abb83c7f416d9 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/926b523c2c7279384627809e10edd1de b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/926b523c2c7279384627809e10edd1de new file mode 100644 index 0000000000..147d780c05 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/926b523c2c7279384627809e10edd1de differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/92965952e0b7faea92adfa6c664ba0e8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/92965952e0b7faea92adfa6c664ba0e8 new file mode 100644 index 0000000000..dbc3c761f1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/92965952e0b7faea92adfa6c664ba0e8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/929f908c6c402f83e8ec4d4be889fe0d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/929f908c6c402f83e8ec4d4be889fe0d new file mode 100644 index 0000000000..06aeb5e5c4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/929f908c6c402f83e8ec4d4be889fe0d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/93381dfcb26aa82cab20cc2d60927c63 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/93381dfcb26aa82cab20cc2d60927c63 new file mode 100644 index 0000000000..ccb790c5c2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/93381dfcb26aa82cab20cc2d60927c63 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9396c0c0fcdcdbb313433033a60de378 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9396c0c0fcdcdbb313433033a60de378 new file mode 100644 index 0000000000..8d3777ef2c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9396c0c0fcdcdbb313433033a60de378 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9441a9038f966b6b560a26db94001cdd b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9441a9038f966b6b560a26db94001cdd new file mode 100644 index 0000000000..d793ec8657 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9441a9038f966b6b560a26db94001cdd differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/962602022f1ed206e0bbc2942a68f681 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/962602022f1ed206e0bbc2942a68f681 new file mode 100644 index 0000000000..4814a900f8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/962602022f1ed206e0bbc2942a68f681 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/974c52ed4c0b8f6873a594f27dc34d39 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/974c52ed4c0b8f6873a594f27dc34d39 new file mode 100644 index 0000000000..3a1770ed53 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/974c52ed4c0b8f6873a594f27dc34d39 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/97da473874a053b2e16cd20640e39440 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/97da473874a053b2e16cd20640e39440 new file mode 100644 index 0000000000..1c290f1aad Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/97da473874a053b2e16cd20640e39440 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9d05d0a9dd66e80b4a3c260d9ef50a2b b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9d05d0a9dd66e80b4a3c260d9ef50a2b new file mode 100644 index 0000000000..5d154125d0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9d05d0a9dd66e80b4a3c260d9ef50a2b differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9f0697804852f59b31d9c648bc3693e8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9f0697804852f59b31d9c648bc3693e8 new file mode 100644 index 0000000000..8eb60c6411 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9f0697804852f59b31d9c648bc3693e8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9fe0ff700dbbe39f3a5e1c1f9b62a9ca b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9fe0ff700dbbe39f3a5e1c1f9b62a9ca new file mode 100644 index 0000000000..a835508548 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/9fe0ff700dbbe39f3a5e1c1f9b62a9ca differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a078edb157db5533ec5c3e69adabcaba b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a078edb157db5533ec5c3e69adabcaba new file mode 100644 index 0000000000..125b4fd575 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a078edb157db5533ec5c3e69adabcaba differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a26d0bdf4ae85865a9123bd68323f181 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a26d0bdf4ae85865a9123bd68323f181 new file mode 100644 index 0000000000..c2a82e89df Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a26d0bdf4ae85865a9123bd68323f181 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a2c21e2dadac90c0939d4218761b6b12 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a2c21e2dadac90c0939d4218761b6b12 new file mode 100644 index 0000000000..f6fc0e983d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a2c21e2dadac90c0939d4218761b6b12 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a47db60e1cba0eb52fd987030572d341 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a47db60e1cba0eb52fd987030572d341 new file mode 100644 index 0000000000..fdc2e03c02 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a47db60e1cba0eb52fd987030572d341 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a54c25bddce7ac8078b8a74cd8944d86 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a54c25bddce7ac8078b8a74cd8944d86 new file mode 100644 index 0000000000..59a50297bc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a54c25bddce7ac8078b8a74cd8944d86 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a6e6ba52de378b9b554cf3703115a025 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a6e6ba52de378b9b554cf3703115a025 new file mode 100644 index 0000000000..2fed8d5cc5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a6e6ba52de378b9b554cf3703115a025 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a869dfcca2540143d16a4bc009b3a2fa b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a869dfcca2540143d16a4bc009b3a2fa new file mode 100644 index 0000000000..63e31f5c72 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a869dfcca2540143d16a4bc009b3a2fa differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8cdb9cc37aee2fdd5500dd63a7d743a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8cdb9cc37aee2fdd5500dd63a7d743a new file mode 100644 index 0000000000..102f8d1b66 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8cdb9cc37aee2fdd5500dd63a7d743a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8d2362148467092be4677894b16f8d4 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8d2362148467092be4677894b16f8d4 new file mode 100644 index 0000000000..4652ea6c03 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/a8d2362148467092be4677894b16f8d4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/abac4adc8b0110c2160558df2c973876 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/abac4adc8b0110c2160558df2c973876 new file mode 100644 index 0000000000..7fc25c1917 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/abac4adc8b0110c2160558df2c973876 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/acb2fb6ead536454fd9ad8009974cd90 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/acb2fb6ead536454fd9ad8009974cd90 new file mode 100644 index 0000000000..bb125cd91d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/acb2fb6ead536454fd9ad8009974cd90 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b28fb7dfc5de554c3df0e8564d6568f1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b28fb7dfc5de554c3df0e8564d6568f1 new file mode 100644 index 0000000000..9af3341baa Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b28fb7dfc5de554c3df0e8564d6568f1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b2efb055cf871cd2641e9ca53aef01cc b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b2efb055cf871cd2641e9ca53aef01cc new file mode 100644 index 0000000000..03651818ca Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b2efb055cf871cd2641e9ca53aef01cc differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b4518cb3c6cf14e7cfbced784a7afa31 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b4518cb3c6cf14e7cfbced784a7afa31 new file mode 100644 index 0000000000..4696e9cbb8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b4518cb3c6cf14e7cfbced784a7afa31 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b5a9fd884ea0518e0fd7a564972335cc b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b5a9fd884ea0518e0fd7a564972335cc new file mode 100644 index 0000000000..5e506d3fab Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b5a9fd884ea0518e0fd7a564972335cc differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b7266944da9cc467dadc276b3330207a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b7266944da9cc467dadc276b3330207a new file mode 100644 index 0000000000..c050e83d46 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b7266944da9cc467dadc276b3330207a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b738d538184222632102c842c47f533f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b738d538184222632102c842c47f533f new file mode 100644 index 0000000000..add3f0ccf0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b738d538184222632102c842c47f533f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b760497f83282ae3e1dea65d40c7b00d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b760497f83282ae3e1dea65d40c7b00d new file mode 100644 index 0000000000..262ed2fe56 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b760497f83282ae3e1dea65d40c7b00d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b768a09f47451344a376e9dc8700dd64 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b768a09f47451344a376e9dc8700dd64 new file mode 100644 index 0000000000..25147f0fff Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b768a09f47451344a376e9dc8700dd64 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b85dbe1aee4d3540018ed4573f726a91 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b85dbe1aee4d3540018ed4573f726a91 new file mode 100644 index 0000000000..dbe9c6574e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b85dbe1aee4d3540018ed4573f726a91 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b9c96ab07109722820724d0720ada567 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b9c96ab07109722820724d0720ada567 new file mode 100644 index 0000000000..f42cfefb4a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/b9c96ab07109722820724d0720ada567 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/baee82a2f9e69460129824141580a750 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/baee82a2f9e69460129824141580a750 new file mode 100644 index 0000000000..3efa8c6f44 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/baee82a2f9e69460129824141580a750 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bcf639b2ffd2ae60450eebbf15b47f9a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bcf639b2ffd2ae60450eebbf15b47f9a new file mode 100644 index 0000000000..fb44c8288e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bcf639b2ffd2ae60450eebbf15b47f9a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bdabec710b7796399edfe17ec5ca0c48 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bdabec710b7796399edfe17ec5ca0c48 new file mode 100644 index 0000000000..791c75b968 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bdabec710b7796399edfe17ec5ca0c48 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bf70c79482b11345388e0064a955b409 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bf70c79482b11345388e0064a955b409 new file mode 100644 index 0000000000..87a75832dc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/bf70c79482b11345388e0064a955b409 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c2cd1551a44ecda6c9fafbb44be2cad2 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c2cd1551a44ecda6c9fafbb44be2cad2 new file mode 100644 index 0000000000..1ce8c84800 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c2cd1551a44ecda6c9fafbb44be2cad2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3a68b2ed1cbe3e7a2a7f28ae33cd95a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3a68b2ed1cbe3e7a2a7f28ae33cd95a new file mode 100644 index 0000000000..600abba8dc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3a68b2ed1cbe3e7a2a7f28ae33cd95a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3da55b96265c33348362ba8d04b47ac b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3da55b96265c33348362ba8d04b47ac new file mode 100644 index 0000000000..c764fc8a0d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c3da55b96265c33348362ba8d04b47ac differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c4f2317c1ecccaf38f11deada1c406c0 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c4f2317c1ecccaf38f11deada1c406c0 new file mode 100644 index 0000000000..f70afb3905 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c4f2317c1ecccaf38f11deada1c406c0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c72c7b5da3eb131b2f97baebc39b325c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c72c7b5da3eb131b2f97baebc39b325c new file mode 100644 index 0000000000..120889279b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c72c7b5da3eb131b2f97baebc39b325c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c99481489b9fc0562e75ecafcc5e1ce8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c99481489b9fc0562e75ecafcc5e1ce8 new file mode 100644 index 0000000000..12f76fdeb4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/c99481489b9fc0562e75ecafcc5e1ce8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ca1bdce64e30be9275725b4e8cafd21f b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ca1bdce64e30be9275725b4e8cafd21f new file mode 100644 index 0000000000..6cf09964ba Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ca1bdce64e30be9275725b4e8cafd21f differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc2d2410ff2896d01d470924f52c6a56 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc2d2410ff2896d01d470924f52c6a56 new file mode 100644 index 0000000000..ee91a9d5e0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc2d2410ff2896d01d470924f52c6a56 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc71d8c3dd87c1a495eda2532fa05998 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc71d8c3dd87c1a495eda2532fa05998 new file mode 100644 index 0000000000..47685bb03d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cc71d8c3dd87c1a495eda2532fa05998 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cd0f1ab8576b72f84170faaf10180b95 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cd0f1ab8576b72f84170faaf10180b95 new file mode 100644 index 0000000000..edede6c333 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cd0f1ab8576b72f84170faaf10180b95 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ce9f72d85d11bdcd12a4467a00725de6 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ce9f72d85d11bdcd12a4467a00725de6 new file mode 100644 index 0000000000..a1c3a5d851 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ce9f72d85d11bdcd12a4467a00725de6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ceba4d7be04b37193ff4d197f3bb5801 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ceba4d7be04b37193ff4d197f3bb5801 new file mode 100644 index 0000000000..5e0c7b6467 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ceba4d7be04b37193ff4d197f3bb5801 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cf20619c6f57ac1dd959ae6ab671cdc7 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cf20619c6f57ac1dd959ae6ab671cdc7 new file mode 100644 index 0000000000..6721ccd4c6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/cf20619c6f57ac1dd959ae6ab671cdc7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d7945ed5eab3eb452fc19a8df8f267de b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d7945ed5eab3eb452fc19a8df8f267de new file mode 100644 index 0000000000..ded0f41cf5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d7945ed5eab3eb452fc19a8df8f267de differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9862736d5ab61240ab94f26e99e21eb b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9862736d5ab61240ab94f26e99e21eb new file mode 100644 index 0000000000..b53970b0df Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9862736d5ab61240ab94f26e99e21eb differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9e4ab3532dcdc0ea254804dafce4b8d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9e4ab3532dcdc0ea254804dafce4b8d new file mode 100644 index 0000000000..6a77537014 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/d9e4ab3532dcdc0ea254804dafce4b8d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/da4bf55a3690c031cfc87a301ba80c24 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/da4bf55a3690c031cfc87a301ba80c24 new file mode 100644 index 0000000000..87116fab1c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/da4bf55a3690c031cfc87a301ba80c24 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dad42544f7d891321c8884b0bf03656e b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dad42544f7d891321c8884b0bf03656e new file mode 100644 index 0000000000..93ea5d774f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dad42544f7d891321c8884b0bf03656e differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/db25be2846f2067406f581a4a67ea866 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/db25be2846f2067406f581a4a67ea866 new file mode 100644 index 0000000000..d2f27c5548 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/db25be2846f2067406f581a4a67ea866 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc2eb4cd60675e1fbcc28e5ca66158bd b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc2eb4cd60675e1fbcc28e5ca66158bd new file mode 100644 index 0000000000..5935514f2c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc2eb4cd60675e1fbcc28e5ca66158bd differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc53c79f7f91213902fe16a364ace3b8 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc53c79f7f91213902fe16a364ace3b8 new file mode 100644 index 0000000000..3cfe777e1e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dc53c79f7f91213902fe16a364ace3b8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dcc81ad3da448a7f3ba80d221f6f7ee0 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dcc81ad3da448a7f3ba80d221f6f7ee0 new file mode 100644 index 0000000000..adabcbec9c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dcc81ad3da448a7f3ba80d221f6f7ee0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/de524a01191644a593931e2d6d23bc30 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/de524a01191644a593931e2d6d23bc30 new file mode 100644 index 0000000000..369d7fdde9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/de524a01191644a593931e2d6d23bc30 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/df1224bef19e623fbb59592b5eb4ddab b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/df1224bef19e623fbb59592b5eb4ddab new file mode 100644 index 0000000000..79c4cbf963 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/df1224bef19e623fbb59592b5eb4ddab differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dfda2a71bdabbebe8b2e9d660b3d6a57 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dfda2a71bdabbebe8b2e9d660b3d6a57 new file mode 100644 index 0000000000..e600836c94 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/dfda2a71bdabbebe8b2e9d660b3d6a57 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1451db14be41563790f219f523d2996 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1451db14be41563790f219f523d2996 new file mode 100644 index 0000000000..50fef4605f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1451db14be41563790f219f523d2996 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1bb10db1e2be2e85ac6fa284944886c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1bb10db1e2be2e85ac6fa284944886c new file mode 100644 index 0000000000..bc693f722e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1bb10db1e2be2e85ac6fa284944886c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1ca74dc16a3cd175f8c6e37afbdcfa3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1ca74dc16a3cd175f8c6e37afbdcfa3 new file mode 100644 index 0000000000..de6923923c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e1ca74dc16a3cd175f8c6e37afbdcfa3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e2dba4a5638f54b0e0f39d11f2a924c4 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e2dba4a5638f54b0e0f39d11f2a924c4 new file mode 100644 index 0000000000..c6b96345ea Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e2dba4a5638f54b0e0f39d11f2a924c4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e322543da75f763bc73d294d2027c4e5 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e322543da75f763bc73d294d2027c4e5 new file mode 100644 index 0000000000..f64bcb2020 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e322543da75f763bc73d294d2027c4e5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e4644cb15b078758696a14c2412ab63c b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e4644cb15b078758696a14c2412ab63c new file mode 100644 index 0000000000..d785194a77 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e4644cb15b078758696a14c2412ab63c differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e575cb182bc3ac61b6a7be90f7ae3039 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e575cb182bc3ac61b6a7be90f7ae3039 new file mode 100644 index 0000000000..6b20dec722 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e575cb182bc3ac61b6a7be90f7ae3039 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92cb29550d6856860efbcf63ca2f84d b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92cb29550d6856860efbcf63ca2f84d new file mode 100644 index 0000000000..2f7d5347e1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92cb29550d6856860efbcf63ca2f84d differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92f2bff34cd15205736bdfaec92e0b2 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92f2bff34cd15205736bdfaec92e0b2 new file mode 100644 index 0000000000..eacf33324f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e92f2bff34cd15205736bdfaec92e0b2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e932fd12fa73a8da93bccb304b4524e9 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e932fd12fa73a8da93bccb304b4524e9 new file mode 100644 index 0000000000..3168468c0b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/e932fd12fa73a8da93bccb304b4524e9 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ec053081bae51e7488ea56c2ce5eae0a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ec053081bae51e7488ea56c2ce5eae0a new file mode 100644 index 0000000000..0b74e5879d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ec053081bae51e7488ea56c2ce5eae0a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ed4df59753dc85fc591c9d1b9cdf2233 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ed4df59753dc85fc591c9d1b9cdf2233 new file mode 100644 index 0000000000..f4a1fbc49b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/ed4df59753dc85fc591c9d1b9cdf2233 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f0aa8886bbd4c3d124f9a2762d779fc3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f0aa8886bbd4c3d124f9a2762d779fc3 new file mode 100644 index 0000000000..404b3b6144 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f0aa8886bbd4c3d124f9a2762d779fc3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f17a67645eb00ae517ee1ff52742785a b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f17a67645eb00ae517ee1ff52742785a new file mode 100644 index 0000000000..d8a8c0aeb2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f17a67645eb00ae517ee1ff52742785a differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f4638c792f45b46316c05f9034cfebc1 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f4638c792f45b46316c05f9034cfebc1 new file mode 100644 index 0000000000..610d9b9431 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f4638c792f45b46316c05f9034cfebc1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f7b45feb6a505b7b17a398b2eab12e70 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f7b45feb6a505b7b17a398b2eab12e70 new file mode 100644 index 0000000000..0756e65ba4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/f7b45feb6a505b7b17a398b2eab12e70 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fa3fce4c2cbb1453f3af2dc6540f15a3 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fa3fce4c2cbb1453f3af2dc6540f15a3 new file mode 100644 index 0000000000..6ec91a8e4b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fa3fce4c2cbb1453f3af2dc6540f15a3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcab25b13e58daa219afd4b3fdffe015 b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcab25b13e58daa219afd4b3fdffe015 new file mode 100644 index 0000000000..5c9451db5c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcab25b13e58daa219afd4b3fdffe015 differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcf770e1e11465ca54d7e9d701d751df b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcf770e1e11465ca54d7e9d701d751df new file mode 100644 index 0000000000..f14a3d2db9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fcf770e1e11465ca54d7e9d701d751df differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fec3b85a2e0334a3c476f71d3b5d78aa b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fec3b85a2e0334a3c476f71d3b5d78aa new file mode 100644 index 0000000000..d2e0abfd89 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/d/fec3b85a2e0334a3c476f71d3b5d78aa differ diff --git a/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/manifest.ocdbt b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/manifest.ocdbt new file mode 100644 index 0000000000..b067dc4bbd Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_high_arity.ocdbt/manifest.ocdbt differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/02548109a1901cbdfca0fe26774853f7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/02548109a1901cbdfca0fe26774853f7 new file mode 100644 index 0000000000..bdc03657c5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/02548109a1901cbdfca0fe26774853f7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/043e80bfab8c20ada61f4a85c35bc65f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/043e80bfab8c20ada61f4a85c35bc65f new file mode 100644 index 0000000000..85ecad295c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/043e80bfab8c20ada61f4a85c35bc65f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05ad5dae4908a02a99cd46b9b1fe1481 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05ad5dae4908a02a99cd46b9b1fe1481 new file mode 100644 index 0000000000..bb576900a3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05ad5dae4908a02a99cd46b9b1fe1481 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05bd1bc04b6b1869b67eb3fc95fa33a8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05bd1bc04b6b1869b67eb3fc95fa33a8 new file mode 100644 index 0000000000..a4a20ac85f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/05bd1bc04b6b1869b67eb3fc95fa33a8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0729aa18faa7b6f5e299d51034297c88 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0729aa18faa7b6f5e299d51034297c88 new file mode 100644 index 0000000000..f7a5d23a06 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0729aa18faa7b6f5e299d51034297c88 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/07608c9cc652b5947075599209213ace b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/07608c9cc652b5947075599209213ace new file mode 100644 index 0000000000..6fb4f4b3e3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/07608c9cc652b5947075599209213ace differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/099979802101fb9a1d148265722cc8be b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/099979802101fb9a1d148265722cc8be new file mode 100644 index 0000000000..87a75832dc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/099979802101fb9a1d148265722cc8be differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0b3d70b4df8f909c3b9eb6ddfab3b5ad b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0b3d70b4df8f909c3b9eb6ddfab3b5ad new file mode 100644 index 0000000000..79c4cbf963 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0b3d70b4df8f909c3b9eb6ddfab3b5ad differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0cdcf336cc4bde0120a4e7af728361c2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0cdcf336cc4bde0120a4e7af728361c2 new file mode 100644 index 0000000000..d8a8c0aeb2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0cdcf336cc4bde0120a4e7af728361c2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0d001f0572252a2778fc27f07c53d51f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0d001f0572252a2778fc27f07c53d51f new file mode 100644 index 0000000000..ceb78811f6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0d001f0572252a2778fc27f07c53d51f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0e619d626ccda5000235e910e525265d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0e619d626ccda5000235e910e525265d new file mode 100644 index 0000000000..97faf25d43 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0e619d626ccda5000235e910e525265d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0f79738ef4973d26e9179e1e584ced29 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0f79738ef4973d26e9179e1e584ced29 new file mode 100644 index 0000000000..9f04926e6a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/0f79738ef4973d26e9179e1e584ced29 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/189be73ecb9d739875c213c6fd87d98d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/189be73ecb9d739875c213c6fd87d98d new file mode 100644 index 0000000000..934e060310 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/189be73ecb9d739875c213c6fd87d98d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a334a67aea2b2ec9732e3bbfbe9ca97 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a334a67aea2b2ec9732e3bbfbe9ca97 new file mode 100644 index 0000000000..8bab4f1d3c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a334a67aea2b2ec9732e3bbfbe9ca97 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a92c9570133ac8837fbccedba6e21ed b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a92c9570133ac8837fbccedba6e21ed new file mode 100644 index 0000000000..27dcd0b98f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1a92c9570133ac8837fbccedba6e21ed differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cd70aa0ef36cc9c71cad9fad6734ce0 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cd70aa0ef36cc9c71cad9fad6734ce0 new file mode 100644 index 0000000000..22420aab20 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cd70aa0ef36cc9c71cad9fad6734ce0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf5a9ff403be34d67471cb97badf7d6 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf5a9ff403be34d67471cb97badf7d6 new file mode 100644 index 0000000000..db73936aa9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf5a9ff403be34d67471cb97badf7d6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf8950d26a193c21298547dd2368b39 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf8950d26a193c21298547dd2368b39 new file mode 100644 index 0000000000..fb44c8288e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/1cf8950d26a193c21298547dd2368b39 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/205bd3ade8dad7ba6f18df899cd04ab5 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/205bd3ade8dad7ba6f18df899cd04ab5 new file mode 100644 index 0000000000..a92a18a405 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/205bd3ade8dad7ba6f18df899cd04ab5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/209410f9d5bc1f94bf463fda6ee6f4dc b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/209410f9d5bc1f94bf463fda6ee6f4dc new file mode 100644 index 0000000000..1ce8c84800 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/209410f9d5bc1f94bf463fda6ee6f4dc differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/20e46b1af332f899d29e18b318f22cae b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/20e46b1af332f899d29e18b318f22cae new file mode 100644 index 0000000000..5fff1232f1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/20e46b1af332f899d29e18b318f22cae differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2347c1138357397a0326f07cea4ad11e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2347c1138357397a0326f07cea4ad11e new file mode 100644 index 0000000000..f987ab3c54 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2347c1138357397a0326f07cea4ad11e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/245e2471b3d926eea14b9d23e98d375f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/245e2471b3d926eea14b9d23e98d375f new file mode 100644 index 0000000000..4ace673240 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/245e2471b3d926eea14b9d23e98d375f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/27e60589c6068c63eba971a1775c2448 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/27e60589c6068c63eba971a1775c2448 new file mode 100644 index 0000000000..ded0f41cf5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/27e60589c6068c63eba971a1775c2448 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2901dc8eaf600219dee0e1c09c0b479d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2901dc8eaf600219dee0e1c09c0b479d new file mode 100644 index 0000000000..9c58e4ce49 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2901dc8eaf600219dee0e1c09c0b479d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2b6f1d251227201a1c6875dc3ab49f6a b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2b6f1d251227201a1c6875dc3ab49f6a new file mode 100644 index 0000000000..38da42aa5c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2b6f1d251227201a1c6875dc3ab49f6a differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c1a2876d36434cccc2093ff7e9ea673 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c1a2876d36434cccc2093ff7e9ea673 new file mode 100644 index 0000000000..4652ea6c03 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c1a2876d36434cccc2093ff7e9ea673 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c2d52532349155c96f00f18db2500f8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c2d52532349155c96f00f18db2500f8 new file mode 100644 index 0000000000..0582e8a62c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2c2d52532349155c96f00f18db2500f8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2cebe1beccf77e1424c55979c722f604 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2cebe1beccf77e1424c55979c722f604 new file mode 100644 index 0000000000..2de1e74b8b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2cebe1beccf77e1424c55979c722f604 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2e4caf36807a4e04d2331165c315d95e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2e4caf36807a4e04d2331165c315d95e new file mode 100644 index 0000000000..d22c7226a7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2e4caf36807a4e04d2331165c315d95e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2f2146e33b34553e32c72afd1972c254 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2f2146e33b34553e32c72afd1972c254 new file mode 100644 index 0000000000..12f76fdeb4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/2f2146e33b34553e32c72afd1972c254 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/324add285813ae99f1ff8f357fbe660c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/324add285813ae99f1ff8f357fbe660c new file mode 100644 index 0000000000..9e2b00be0e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/324add285813ae99f1ff8f357fbe660c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/33cf8795fa4328ce4478d49f60905308 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/33cf8795fa4328ce4478d49f60905308 new file mode 100644 index 0000000000..63e31f5c72 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/33cf8795fa4328ce4478d49f60905308 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3551afbf9cc31624ee4677ab68a81b6b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3551afbf9cc31624ee4677ab68a81b6b new file mode 100644 index 0000000000..59a50297bc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3551afbf9cc31624ee4677ab68a81b6b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/37c449d13b6e91ad9a3ca15ccc1b2a5b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/37c449d13b6e91ad9a3ca15ccc1b2a5b new file mode 100644 index 0000000000..53bcbd3e05 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/37c449d13b6e91ad9a3ca15ccc1b2a5b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/392ab66bfd29b8499de5a2a9943ff3cc b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/392ab66bfd29b8499de5a2a9943ff3cc new file mode 100644 index 0000000000..526fdf9aec Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/392ab66bfd29b8499de5a2a9943ff3cc differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3951209c532ba56ba4acc90a2a85df9f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3951209c532ba56ba4acc90a2a85df9f new file mode 100644 index 0000000000..824dd148d3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3951209c532ba56ba4acc90a2a85df9f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3a60e596a7897f30425406c901ee2b32 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3a60e596a7897f30425406c901ee2b32 new file mode 100644 index 0000000000..5aa08c4b01 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3a60e596a7897f30425406c901ee2b32 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3c3a59e5c9bccba89ba5d0fa531b3367 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3c3a59e5c9bccba89ba5d0fa531b3367 new file mode 100644 index 0000000000..213142b353 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3c3a59e5c9bccba89ba5d0fa531b3367 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e2f193f014feb3fb556b58eb8424aec b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e2f193f014feb3fb556b58eb8424aec new file mode 100644 index 0000000000..cf2d620e5b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e2f193f014feb3fb556b58eb8424aec differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e64379b32739c61f1618e74b85887dc b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e64379b32739c61f1618e74b85887dc new file mode 100644 index 0000000000..ca6be024dc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3e64379b32739c61f1618e74b85887dc differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3ed665e8739659413c9815e83a73018d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3ed665e8739659413c9815e83a73018d new file mode 100644 index 0000000000..4a1555202d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3ed665e8739659413c9815e83a73018d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3fcaba294802c4c3b278c23b179fea05 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3fcaba294802c4c3b278c23b179fea05 new file mode 100644 index 0000000000..0756e65ba4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/3fcaba294802c4c3b278c23b179fea05 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4051033db0ad4c519208feb712b790e3 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4051033db0ad4c519208feb712b790e3 new file mode 100644 index 0000000000..c2a82e89df Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4051033db0ad4c519208feb712b790e3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/41061b9413c17fc5511845587fb6bc1f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/41061b9413c17fc5511845587fb6bc1f new file mode 100644 index 0000000000..18ca3fd1d7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/41061b9413c17fc5511845587fb6bc1f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4429962bad48ddbceefc16cdbb10c405 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4429962bad48ddbceefc16cdbb10c405 new file mode 100644 index 0000000000..bb125cd91d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4429962bad48ddbceefc16cdbb10c405 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4503358bc538842c67147d91e754cf53 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4503358bc538842c67147d91e754cf53 new file mode 100644 index 0000000000..2779a55bb8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4503358bc538842c67147d91e754cf53 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4518377f86c19cea927f621ce4c76c73 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4518377f86c19cea927f621ce4c76c73 new file mode 100644 index 0000000000..102f8d1b66 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4518377f86c19cea927f621ce4c76c73 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/45a59888c0c2282729d2b6e676b1930a b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/45a59888c0c2282729d2b6e676b1930a new file mode 100644 index 0000000000..fe7bbe40d4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/45a59888c0c2282729d2b6e676b1930a differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4654532d23e8997703b4f058b2ac21cd b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4654532d23e8997703b4f058b2ac21cd new file mode 100644 index 0000000000..400b8229f7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4654532d23e8997703b4f058b2ac21cd differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4669293f15f0d1cc3fc747233ed638e7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4669293f15f0d1cc3fc747233ed638e7 new file mode 100644 index 0000000000..d9216553f0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4669293f15f0d1cc3fc747233ed638e7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47362060c2f6e9950b52a8b08c1fd4b9 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47362060c2f6e9950b52a8b08c1fd4b9 new file mode 100644 index 0000000000..3569dbe2c7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47362060c2f6e9950b52a8b08c1fd4b9 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47780fe4bbcb87e901ff15f556f166bb b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47780fe4bbcb87e901ff15f556f166bb new file mode 100644 index 0000000000..f64bcb2020 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47780fe4bbcb87e901ff15f556f166bb differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47df85e8237eb439e9d21f71c4c61f92 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47df85e8237eb439e9d21f71c4c61f92 new file mode 100644 index 0000000000..b201d1ae6d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/47df85e8237eb439e9d21f71c4c61f92 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/491933b0aade4e7af62fc52f9305bb0d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/491933b0aade4e7af62fc52f9305bb0d new file mode 100644 index 0000000000..99023a47bc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/491933b0aade4e7af62fc52f9305bb0d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ae71221edb016b2008df7e218d71048 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ae71221edb016b2008df7e218d71048 new file mode 100644 index 0000000000..080f65cc33 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ae71221edb016b2008df7e218d71048 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dbf2c75080664408e1a8391829f3e27 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dbf2c75080664408e1a8391829f3e27 new file mode 100644 index 0000000000..f1dcd06556 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dbf2c75080664408e1a8391829f3e27 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dd8d967f9aecc05d8ad54a771f88791 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dd8d967f9aecc05d8ad54a771f88791 new file mode 100644 index 0000000000..1282aaf54a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4dd8d967f9aecc05d8ad54a771f88791 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4e5d3e69bd2b30d344efc683d17d4430 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4e5d3e69bd2b30d344efc683d17d4430 new file mode 100644 index 0000000000..ba47a4f547 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4e5d3e69bd2b30d344efc683d17d4430 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f2fb3bdaacccae9766e8cdcb94a9141 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f2fb3bdaacccae9766e8cdcb94a9141 new file mode 100644 index 0000000000..15f57fda8f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f2fb3bdaacccae9766e8cdcb94a9141 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f80091f9e68bd2674ee514028caa8b2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f80091f9e68bd2674ee514028caa8b2 new file mode 100644 index 0000000000..8f57608f8a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4f80091f9e68bd2674ee514028caa8b2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ffcd46b44760139c287c9bab6efe59f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ffcd46b44760139c287c9bab6efe59f new file mode 100644 index 0000000000..e9daa9b3db Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/4ffcd46b44760139c287c9bab6efe59f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/503b23dc543609af1551fb5807ba36a8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/503b23dc543609af1551fb5807ba36a8 new file mode 100644 index 0000000000..ec7a963f1d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/503b23dc543609af1551fb5807ba36a8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/50c5f64d9f739564c998e25499d6fc2c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/50c5f64d9f739564c998e25499d6fc2c new file mode 100644 index 0000000000..3529c72650 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/50c5f64d9f739564c998e25499d6fc2c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55060ba3d231310e2e69e22162b9a1ef b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55060ba3d231310e2e69e22162b9a1ef new file mode 100644 index 0000000000..8e0c87f147 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55060ba3d231310e2e69e22162b9a1ef differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/556296327438dc78f74233a6c9e5fbc8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/556296327438dc78f74233a6c9e5fbc8 new file mode 100644 index 0000000000..893acfa0e7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/556296327438dc78f74233a6c9e5fbc8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55efac3b4be25e0991fe8591c3a0ccff b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55efac3b4be25e0991fe8591c3a0ccff new file mode 100644 index 0000000000..4cb36950ac Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/55efac3b4be25e0991fe8591c3a0ccff differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/57f9634c9e71bbf312aad267e4a954ba b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/57f9634c9e71bbf312aad267e4a954ba new file mode 100644 index 0000000000..e437c3c795 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/57f9634c9e71bbf312aad267e4a954ba differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a466b0b62b72d4dd3fd9a0c1010defe b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a466b0b62b72d4dd3fd9a0c1010defe new file mode 100644 index 0000000000..b1a4ec40fa Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a466b0b62b72d4dd3fd9a0c1010defe differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a8e9a495dc2f9457c3b9ef1486f2134 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a8e9a495dc2f9457c3b9ef1486f2134 new file mode 100644 index 0000000000..4341560960 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5a8e9a495dc2f9457c3b9ef1486f2134 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5c0aa9eb8b73075d1f21dc2b1964ef74 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5c0aa9eb8b73075d1f21dc2b1964ef74 new file mode 100644 index 0000000000..dbc3c761f1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5c0aa9eb8b73075d1f21dc2b1964ef74 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5cb65e730edbbc489425d543232166d6 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5cb65e730edbbc489425d543232166d6 new file mode 100644 index 0000000000..140add8e36 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5cb65e730edbbc489425d543232166d6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5dc3ac867b525c40513dc50d05391085 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5dc3ac867b525c40513dc50d05391085 new file mode 100644 index 0000000000..6721ccd4c6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5dc3ac867b525c40513dc50d05391085 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5e342f568130f33955112b19930bcb16 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5e342f568130f33955112b19930bcb16 new file mode 100644 index 0000000000..76390bf7cc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5e342f568130f33955112b19930bcb16 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f0370b90b0c47a791febc05ffd8ac0f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f0370b90b0c47a791febc05ffd8ac0f new file mode 100644 index 0000000000..b0d3a0001f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f0370b90b0c47a791febc05ffd8ac0f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f34941710f5870ae60dc1052521470e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f34941710f5870ae60dc1052521470e new file mode 100644 index 0000000000..9ac18cbf16 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/5f34941710f5870ae60dc1052521470e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/632cf0b24189b9de7743e42f8a63f1f8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/632cf0b24189b9de7743e42f8a63f1f8 new file mode 100644 index 0000000000..df93bb2429 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/632cf0b24189b9de7743e42f8a63f1f8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/635cdaa83ab65b55b71ae8bd4eae19dc b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/635cdaa83ab65b55b71ae8bd4eae19dc new file mode 100644 index 0000000000..7a87ca0a7f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/635cdaa83ab65b55b71ae8bd4eae19dc differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6399a5ecb7b83fa8f11e5cfc108f5650 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6399a5ecb7b83fa8f11e5cfc108f5650 new file mode 100644 index 0000000000..8322f4d06b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6399a5ecb7b83fa8f11e5cfc108f5650 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/63edb37fc558dc11d79128d8fbe2c17f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/63edb37fc558dc11d79128d8fbe2c17f new file mode 100644 index 0000000000..d0e7a45f19 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/63edb37fc558dc11d79128d8fbe2c17f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6473d8c496b0e677eb5eb672200990b4 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6473d8c496b0e677eb5eb672200990b4 new file mode 100644 index 0000000000..ed62e8bbdf Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6473d8c496b0e677eb5eb672200990b4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6521becb9569595554db007508517daa b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6521becb9569595554db007508517daa new file mode 100644 index 0000000000..a097866093 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6521becb9569595554db007508517daa differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67b73ee8bd7866bc50b9db58b737e122 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67b73ee8bd7866bc50b9db58b737e122 new file mode 100644 index 0000000000..47685bb03d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67b73ee8bd7866bc50b9db58b737e122 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67e616e08df4a2b72f830ee8e61beb73 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67e616e08df4a2b72f830ee8e61beb73 new file mode 100644 index 0000000000..6c14870b78 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/67e616e08df4a2b72f830ee8e61beb73 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6b0eb26e566048a2ecf7400c337a05db b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6b0eb26e566048a2ecf7400c337a05db new file mode 100644 index 0000000000..db961af0e8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6b0eb26e566048a2ecf7400c337a05db differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6cfa02ea76ca4fa3309ae37fdc8d50a5 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6cfa02ea76ca4fa3309ae37fdc8d50a5 new file mode 100644 index 0000000000..46d4724a94 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6cfa02ea76ca4fa3309ae37fdc8d50a5 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6d912e86a6bd6e7948b464b168e5c1be b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6d912e86a6bd6e7948b464b168e5c1be new file mode 100644 index 0000000000..bb26f8a08d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6d912e86a6bd6e7948b464b168e5c1be differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6f6d992f37996742d9e17fa86d538626 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6f6d992f37996742d9e17fa86d538626 new file mode 100644 index 0000000000..85c9a2bbe9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6f6d992f37996742d9e17fa86d538626 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6fa91dd74738d24f86e0f44d8cacabec b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6fa91dd74738d24f86e0f44d8cacabec new file mode 100644 index 0000000000..f383537708 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/6fa91dd74738d24f86e0f44d8cacabec differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/70e5c1dc931479e48564bf6c54fe20a2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/70e5c1dc931479e48564bf6c54fe20a2 new file mode 100644 index 0000000000..85e0f50565 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/70e5c1dc931479e48564bf6c54fe20a2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7133d7a680aac7a5ec5ab6a030ed5f05 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7133d7a680aac7a5ec5ab6a030ed5f05 new file mode 100644 index 0000000000..7b4f9450cb Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7133d7a680aac7a5ec5ab6a030ed5f05 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7171f842988d0c0b5a29c0cdd801cc9b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7171f842988d0c0b5a29c0cdd801cc9b new file mode 100644 index 0000000000..9cfc4a2d11 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7171f842988d0c0b5a29c0cdd801cc9b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72c4dcf13bc33e356c0df8bff2c568f7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72c4dcf13bc33e356c0df8bff2c568f7 new file mode 100644 index 0000000000..3b059af530 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72c4dcf13bc33e356c0df8bff2c568f7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72e65cec37b341e7da58c91a5e42e4f6 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72e65cec37b341e7da58c91a5e42e4f6 new file mode 100644 index 0000000000..f44bb05ba3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/72e65cec37b341e7da58c91a5e42e4f6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/76684c9a9e19e4e55c82742e25fe7cff b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/76684c9a9e19e4e55c82742e25fe7cff new file mode 100644 index 0000000000..a67dafcd80 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/76684c9a9e19e4e55c82742e25fe7cff differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/78c2d8d0542373ae63b5357d33f24efb b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/78c2d8d0542373ae63b5357d33f24efb new file mode 100644 index 0000000000..d0f736b945 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/78c2d8d0542373ae63b5357d33f24efb differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7bc7f0ad205b79218a5e68e153a9d8ff b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7bc7f0ad205b79218a5e68e153a9d8ff new file mode 100644 index 0000000000..0452e38421 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7bc7f0ad205b79218a5e68e153a9d8ff differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7ebbaa7316622ab33c5b5a2addaefd4f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7ebbaa7316622ab33c5b5a2addaefd4f new file mode 100644 index 0000000000..92a26f18d2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7ebbaa7316622ab33c5b5a2addaefd4f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7f6c573211baf56d18c77a5a71e30174 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7f6c573211baf56d18c77a5a71e30174 new file mode 100644 index 0000000000..0d600075a3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/7f6c573211baf56d18c77a5a71e30174 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/800a9ef85447db14884e1c0852f37fd1 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/800a9ef85447db14884e1c0852f37fd1 new file mode 100644 index 0000000000..262ed2fe56 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/800a9ef85447db14884e1c0852f37fd1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/803d7461dcbcc244c91e64c8cb081795 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/803d7461dcbcc244c91e64c8cb081795 new file mode 100644 index 0000000000..4b81c6cc9c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/803d7461dcbcc244c91e64c8cb081795 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8128c6de98d1e3dd1965db651986e04d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8128c6de98d1e3dd1965db651986e04d new file mode 100644 index 0000000000..e2ac5876bc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8128c6de98d1e3dd1965db651986e04d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8182e41b4016e4579cc696fe4eb342c1 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8182e41b4016e4579cc696fe4eb342c1 new file mode 100644 index 0000000000..3fcdaf62d7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8182e41b4016e4579cc696fe4eb342c1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/82e3d7f27356c9ca224774a87a5602e1 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/82e3d7f27356c9ca224774a87a5602e1 new file mode 100644 index 0000000000..d785194a77 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/82e3d7f27356c9ca224774a87a5602e1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/83cecc031f16b9751a46e052579d41a2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/83cecc031f16b9751a46e052579d41a2 new file mode 100644 index 0000000000..695ae92234 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/83cecc031f16b9751a46e052579d41a2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/869af5c20875608d117e24ff9b1741c1 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/869af5c20875608d117e24ff9b1741c1 new file mode 100644 index 0000000000..9e73c16a57 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/869af5c20875608d117e24ff9b1741c1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/884d50ae4d74f880f209360903519a41 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/884d50ae4d74f880f209360903519a41 new file mode 100644 index 0000000000..369d7fdde9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/884d50ae4d74f880f209360903519a41 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8855890cb2bf1e0558300d870bac2c0f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8855890cb2bf1e0558300d870bac2c0f new file mode 100644 index 0000000000..86f1baf1d9 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8855890cb2bf1e0558300d870bac2c0f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/88e4ccf7877413af1fd7c2e95468b5b7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/88e4ccf7877413af1fd7c2e95468b5b7 new file mode 100644 index 0000000000..f83ac14b9f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/88e4ccf7877413af1fd7c2e95468b5b7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/896906f4addb8fd976ee118d3c23507d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/896906f4addb8fd976ee118d3c23507d new file mode 100644 index 0000000000..70028ad9e4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/896906f4addb8fd976ee118d3c23507d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8b0556eafe51eba15d25ca887b459f47 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8b0556eafe51eba15d25ca887b459f47 new file mode 100644 index 0000000000..f70afb3905 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8b0556eafe51eba15d25ca887b459f47 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8c7c567e0060f86b34f38aa5060de3e7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8c7c567e0060f86b34f38aa5060de3e7 new file mode 100644 index 0000000000..c6b96345ea Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8c7c567e0060f86b34f38aa5060de3e7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea1b69196af5753f7fd814e0fb43302 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea1b69196af5753f7fd814e0fb43302 new file mode 100644 index 0000000000..cc053ee9d7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea1b69196af5753f7fd814e0fb43302 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea4fd607c5593dee6156a2ca9ead517 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea4fd607c5593dee6156a2ca9ead517 new file mode 100644 index 0000000000..99d76d24ad Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/8ea4fd607c5593dee6156a2ca9ead517 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/90a6c883597613ed1f7d202b62846795 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/90a6c883597613ed1f7d202b62846795 new file mode 100644 index 0000000000..125b4fd575 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/90a6c883597613ed1f7d202b62846795 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9141e3476977c1a287ad427af681e421 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9141e3476977c1a287ad427af681e421 new file mode 100644 index 0000000000..6c0c17cdff Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9141e3476977c1a287ad427af681e421 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9272b877c456486e990461232af874e0 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9272b877c456486e990461232af874e0 new file mode 100644 index 0000000000..3365bf304a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9272b877c456486e990461232af874e0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9322a809f9c733af87986e95fb3dc97b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9322a809f9c733af87986e95fb3dc97b new file mode 100644 index 0000000000..8d7caa4e26 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9322a809f9c733af87986e95fb3dc97b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9453cc7723ddfb4b348637618e0c523b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9453cc7723ddfb4b348637618e0c523b new file mode 100644 index 0000000000..b53970b0df Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9453cc7723ddfb4b348637618e0c523b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9495caef29e32b73b882a154aabe4711 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9495caef29e32b73b882a154aabe4711 new file mode 100644 index 0000000000..2682b92069 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9495caef29e32b73b882a154aabe4711 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/94e3cbfcbbba1b1f2829b0266cd523a2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/94e3cbfcbbba1b1f2829b0266cd523a2 new file mode 100644 index 0000000000..8091bfccf6 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/94e3cbfcbbba1b1f2829b0266cd523a2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/95b745d1818de867922fc715d979031a b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/95b745d1818de867922fc715d979031a new file mode 100644 index 0000000000..c7e697095d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/95b745d1818de867922fc715d979031a differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/990e6cacc4aa1900aa5443fa9e7ba595 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/990e6cacc4aa1900aa5443fa9e7ba595 new file mode 100644 index 0000000000..c8fb17c5a0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/990e6cacc4aa1900aa5443fa9e7ba595 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/998645ffffe5ba9b24588fb952cc629b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/998645ffffe5ba9b24588fb952cc629b new file mode 100644 index 0000000000..123e03eaf7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/998645ffffe5ba9b24588fb952cc629b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ba4693d7371f7a7792ded6e4a0ebd2b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ba4693d7371f7a7792ded6e4a0ebd2b new file mode 100644 index 0000000000..813d34d3a1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ba4693d7371f7a7792ded6e4a0ebd2b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ebe8dad4f00bf1f55fd367459ffe6fc b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ebe8dad4f00bf1f55fd367459ffe6fc new file mode 100644 index 0000000000..71716f4de7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/9ebe8dad4f00bf1f55fd367459ffe6fc differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a2e57dbe0f000de9726680c767f9fd5e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a2e57dbe0f000de9726680c767f9fd5e new file mode 100644 index 0000000000..9c750ff5f4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a2e57dbe0f000de9726680c767f9fd5e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a344d0245467d32219fcaca9feccaed6 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a344d0245467d32219fcaca9feccaed6 new file mode 100644 index 0000000000..ba25946353 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a344d0245467d32219fcaca9feccaed6 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a436ce02c97e62af7429166e7c1cf755 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a436ce02c97e62af7429166e7c1cf755 new file mode 100644 index 0000000000..73c7d4e0e8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a436ce02c97e62af7429166e7c1cf755 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a4cce836f2370b64faf1a7b8dc616466 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a4cce836f2370b64faf1a7b8dc616466 new file mode 100644 index 0000000000..3cfe777e1e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a4cce836f2370b64faf1a7b8dc616466 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a593f5d0c0fc3f7699eb01c36f44f365 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a593f5d0c0fc3f7699eb01c36f44f365 new file mode 100644 index 0000000000..63a0f46a65 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a593f5d0c0fc3f7699eb01c36f44f365 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a8213aa8629a218407e6992d3fed070c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a8213aa8629a218407e6992d3fed070c new file mode 100644 index 0000000000..fdf7d304f8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a8213aa8629a218407e6992d3fed070c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a82c1ed35dd38e47a0fafccb8a40c0ca b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a82c1ed35dd38e47a0fafccb8a40c0ca new file mode 100644 index 0000000000..5d154125d0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/a82c1ed35dd38e47a0fafccb8a40c0ca differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/aac0713eaa58be100f73a6454d943f3d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/aac0713eaa58be100f73a6454d943f3d new file mode 100644 index 0000000000..438694c468 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/aac0713eaa58be100f73a6454d943f3d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/abf61b420fe028f2b390da3221ae60c2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/abf61b420fe028f2b390da3221ae60c2 new file mode 100644 index 0000000000..e7879281a4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/abf61b420fe028f2b390da3221ae60c2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/acb85445ad1482f3bbc218533087ca2e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/acb85445ad1482f3bbc218533087ca2e new file mode 100644 index 0000000000..4a12888bd0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/acb85445ad1482f3bbc218533087ca2e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ad25197b768450e633a811514d7c046c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ad25197b768450e633a811514d7c046c new file mode 100644 index 0000000000..392f56fe1e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ad25197b768450e633a811514d7c046c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/adca8246678e5ea211d69899f5380533 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/adca8246678e5ea211d69899f5380533 new file mode 100644 index 0000000000..d5a492c3f3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/adca8246678e5ea211d69899f5380533 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/af2267af421df2bcbc8e6bc0d222a97b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/af2267af421df2bcbc8e6bc0d222a97b new file mode 100644 index 0000000000..ea8145efed Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/af2267af421df2bcbc8e6bc0d222a97b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b000f3dd4cf1a4e7a2af2db1fdb4120e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b000f3dd4cf1a4e7a2af2db1fdb4120e new file mode 100644 index 0000000000..25f6cb92b4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b000f3dd4cf1a4e7a2af2db1fdb4120e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b06aa2e0a24a06939084ac6774b109a3 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b06aa2e0a24a06939084ac6774b109a3 new file mode 100644 index 0000000000..70ab4efa04 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b06aa2e0a24a06939084ac6774b109a3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b0a1f9aaeb0dce69a5d329e6b24b4c6e b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b0a1f9aaeb0dce69a5d329e6b24b4c6e new file mode 100644 index 0000000000..3dd4ca51d7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b0a1f9aaeb0dce69a5d329e6b24b4c6e differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b2298c88a2af4c25a3867d713202924b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b2298c88a2af4c25a3867d713202924b new file mode 100644 index 0000000000..c265839448 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b2298c88a2af4c25a3867d713202924b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b469c58d9aac821aceccb8a0ab16831f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b469c58d9aac821aceccb8a0ab16831f new file mode 100644 index 0000000000..b3ffda7495 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b469c58d9aac821aceccb8a0ab16831f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56405bfcd82997c9e30a0b9bcc31e66 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56405bfcd82997c9e30a0b9bcc31e66 new file mode 100644 index 0000000000..816a2eaa00 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56405bfcd82997c9e30a0b9bcc31e66 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56ad5d64ef4b5d0b958a769b313f075 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56ad5d64ef4b5d0b958a769b313f075 new file mode 100644 index 0000000000..78abedbdcc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/b56ad5d64ef4b5d0b958a769b313f075 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bb46729ead6ba6feee3cd95c89fe03d1 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bb46729ead6ba6feee3cd95c89fe03d1 new file mode 100644 index 0000000000..7ea173a0e7 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bb46729ead6ba6feee3cd95c89fe03d1 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bd0c7cc661b4e43003de979f5008da66 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bd0c7cc661b4e43003de979f5008da66 new file mode 100644 index 0000000000..67bec59e6e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/bd0c7cc661b4e43003de979f5008da66 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/be1eb3c332eaca1156843748f2c4e586 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/be1eb3c332eaca1156843748f2c4e586 new file mode 100644 index 0000000000..94eef451f2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/be1eb3c332eaca1156843748f2c4e586 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/beec5827c518058e9cdf40ee4ac87db0 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/beec5827c518058e9cdf40ee4ac87db0 new file mode 100644 index 0000000000..edacb54105 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/beec5827c518058e9cdf40ee4ac87db0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c18b5fac226417b63c43da1a7188bf5f b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c18b5fac226417b63c43da1a7188bf5f new file mode 100644 index 0000000000..2f642d129b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c18b5fac226417b63c43da1a7188bf5f differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c27e74a5fdff311deb63e4562f3910d9 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c27e74a5fdff311deb63e4562f3910d9 new file mode 100644 index 0000000000..5e4dee4c47 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c27e74a5fdff311deb63e4562f3910d9 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c2a0f86d579e81aa2d4e52bdbecafd8c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c2a0f86d579e81aa2d4e52bdbecafd8c new file mode 100644 index 0000000000..cf91c3c288 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c2a0f86d579e81aa2d4e52bdbecafd8c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c5167a53a5d42d28301990586224d276 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c5167a53a5d42d28301990586224d276 new file mode 100644 index 0000000000..fe1b3b6385 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c5167a53a5d42d28301990586224d276 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c51b0fa76fd1ac8d03490356a1bd1037 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c51b0fa76fd1ac8d03490356a1bd1037 new file mode 100644 index 0000000000..444bb83f4e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c51b0fa76fd1ac8d03490356a1bd1037 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c542b433cab07bc501c247e16a957c8c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c542b433cab07bc501c247e16a957c8c new file mode 100644 index 0000000000..c6333536ae Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c542b433cab07bc501c247e16a957c8c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c660c7ed2d2c8ece370c6b93e4384cc4 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c660c7ed2d2c8ece370c6b93e4384cc4 new file mode 100644 index 0000000000..f42cfefb4a Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c660c7ed2d2c8ece370c6b93e4384cc4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c8090963014ae016a1d40d1ec95d9124 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c8090963014ae016a1d40d1ec95d9124 new file mode 100644 index 0000000000..120889279b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/c8090963014ae016a1d40d1ec95d9124 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ceb6977c0c392f99cd696819cb0f321c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ceb6977c0c392f99cd696819cb0f321c new file mode 100644 index 0000000000..352268cddb Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ceb6977c0c392f99cd696819cb0f321c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d07d235e53bba2b02d1725d7d6612a53 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d07d235e53bba2b02d1725d7d6612a53 new file mode 100644 index 0000000000..7eeba39eba Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d07d235e53bba2b02d1725d7d6612a53 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d0a4c8ad14829a1687dcbd0763963575 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d0a4c8ad14829a1687dcbd0763963575 new file mode 100644 index 0000000000..b2bb792e36 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d0a4c8ad14829a1687dcbd0763963575 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d60039e0410eb218813b0f3411dcda79 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d60039e0410eb218813b0f3411dcda79 new file mode 100644 index 0000000000..ce9597d821 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d60039e0410eb218813b0f3411dcda79 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d6688d8fee35bca3807e88cd57a2f1e2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d6688d8fee35bca3807e88cd57a2f1e2 new file mode 100644 index 0000000000..791c75b968 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d6688d8fee35bca3807e88cd57a2f1e2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d7238cb4acaa50f7883e9b006d0ce485 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d7238cb4acaa50f7883e9b006d0ce485 new file mode 100644 index 0000000000..2b60839e46 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d7238cb4acaa50f7883e9b006d0ce485 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d8b2215b797e4f6c5b42675b3a8d9648 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d8b2215b797e4f6c5b42675b3a8d9648 new file mode 100644 index 0000000000..914ac75913 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/d8b2215b797e4f6c5b42675b3a8d9648 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/df024f987a8cf2dd0b219fe1011002bd b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/df024f987a8cf2dd0b219fe1011002bd new file mode 100644 index 0000000000..8f2b2c536b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/df024f987a8cf2dd0b219fe1011002bd differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e11b3b532ec4e3f781c2a68f4dd79ff8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e11b3b532ec4e3f781c2a68f4dd79ff8 new file mode 100644 index 0000000000..1046a842c2 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e11b3b532ec4e3f781c2a68f4dd79ff8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e36459cee42d098266712da253e43e7b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e36459cee42d098266712da253e43e7b new file mode 100644 index 0000000000..915cbdf6dd Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e36459cee42d098266712da253e43e7b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e5027a145f256e82be99fac8a1c6cf79 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e5027a145f256e82be99fac8a1c6cf79 new file mode 100644 index 0000000000..045c45bfe8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e5027a145f256e82be99fac8a1c6cf79 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e59d4a8d4763b1e6d6cc1aa9a741a5c8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e59d4a8d4763b1e6d6cc1aa9a741a5c8 new file mode 100644 index 0000000000..7847322991 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e59d4a8d4763b1e6d6cc1aa9a741a5c8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e67fcdafe00c0d408e1dd39f01e5410c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e67fcdafe00c0d408e1dd39f01e5410c new file mode 100644 index 0000000000..06aeb5e5c4 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e67fcdafe00c0d408e1dd39f01e5410c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7ce00a64ba002515cd4578e18cf4326 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7ce00a64ba002515cd4578e18cf4326 new file mode 100644 index 0000000000..a3ce29fd32 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7ce00a64ba002515cd4578e18cf4326 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7f6ebc059b677b875cd25fe7a8c2a12 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7f6ebc059b677b875cd25fe7a8c2a12 new file mode 100644 index 0000000000..0d8057c7ce Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e7f6ebc059b677b875cd25fe7a8c2a12 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9c2aff7c7fc37990ac27184404e834b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9c2aff7c7fc37990ac27184404e834b new file mode 100644 index 0000000000..85c7dd45d3 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9c2aff7c7fc37990ac27184404e834b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9e057f9c73c1a0b7ba31d0aa19ed6f3 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9e057f9c73c1a0b7ba31d0aa19ed6f3 new file mode 100644 index 0000000000..7d33fd8933 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/e9e057f9c73c1a0b7ba31d0aa19ed6f3 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eaafb969dde8ed4c216f860e3420531a b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eaafb969dde8ed4c216f860e3420531a new file mode 100644 index 0000000000..adabcbec9c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eaafb969dde8ed4c216f860e3420531a differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eb62ee3de4dd9db5847227f7a876d022 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eb62ee3de4dd9db5847227f7a876d022 new file mode 100644 index 0000000000..4f33cd22d5 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/eb62ee3de4dd9db5847227f7a876d022 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed098a378cc991dbec5ec1096e6510f2 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed098a378cc991dbec5ec1096e6510f2 new file mode 100644 index 0000000000..97e37de56f Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed098a378cc991dbec5ec1096e6510f2 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed46de80b712c5dad3de2e65a13387d4 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed46de80b712c5dad3de2e65a13387d4 new file mode 100644 index 0000000000..c764fc8a0d Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ed46de80b712c5dad3de2e65a13387d4 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee46fa3a65f58bfdb647704c42d5769c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee46fa3a65f58bfdb647704c42d5769c new file mode 100644 index 0000000000..d7023d326e Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee46fa3a65f58bfdb647704c42d5769c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee69360f58eed3a1353f2e85a2a0c1c7 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee69360f58eed3a1353f2e85a2a0c1c7 new file mode 100644 index 0000000000..0c5a5a4abc Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ee69360f58eed3a1353f2e85a2a0c1c7 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f245683fb9e86f3720256e4d5528c799 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f245683fb9e86f3720256e4d5528c799 new file mode 100644 index 0000000000..88efa129ed Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f245683fb9e86f3720256e4d5528c799 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f2b87cd11f09a345918f34b2f2b24b8d b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f2b87cd11f09a345918f34b2f2b24b8d new file mode 100644 index 0000000000..fdc2e03c02 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f2b87cd11f09a345918f34b2f2b24b8d differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f39b45b7573bb599eab817164bd29e95 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f39b45b7573bb599eab817164bd29e95 new file mode 100644 index 0000000000..8096a02109 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f39b45b7573bb599eab817164bd29e95 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f403741ccc238a10dd40dd8d419634f8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f403741ccc238a10dd40dd8d419634f8 new file mode 100644 index 0000000000..a4ce3eb428 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f403741ccc238a10dd40dd8d419634f8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f5cdf3232847d1ccc134456b98259071 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f5cdf3232847d1ccc134456b98259071 new file mode 100644 index 0000000000..3a1770ed53 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f5cdf3232847d1ccc134456b98259071 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f606551ae94df9e4fea869dfce8f7bd0 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f606551ae94df9e4fea869dfce8f7bd0 new file mode 100644 index 0000000000..4084e6f3de Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f606551ae94df9e4fea869dfce8f7bd0 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f66cedd2d4d6d14bc72f91ee6087aa9b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f66cedd2d4d6d14bc72f91ee6087aa9b new file mode 100644 index 0000000000..95c0748eb1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f66cedd2d4d6d14bc72f91ee6087aa9b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f6ad5a9777dde46872d0835224e0109c b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f6ad5a9777dde46872d0835224e0109c new file mode 100644 index 0000000000..7fc25c1917 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f6ad5a9777dde46872d0835224e0109c differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f79df300ae44482fee7dfe56479de7ec b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f79df300ae44482fee7dfe56479de7ec new file mode 100644 index 0000000000..f18acffd20 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f79df300ae44482fee7dfe56479de7ec differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f88ab87b45eaf9622835973bcc17028b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f88ab87b45eaf9622835973bcc17028b new file mode 100644 index 0000000000..f3cb40940b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f88ab87b45eaf9622835973bcc17028b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f8ab0a71afad80d3ecffb61822d27238 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f8ab0a71afad80d3ecffb61822d27238 new file mode 100644 index 0000000000..5935514f2c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/f8ab0a71afad80d3ecffb61822d27238 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa3c2c490518964949d780a5927c2d57 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa3c2c490518964949d780a5927c2d57 new file mode 100644 index 0000000000..de6923923c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa3c2c490518964949d780a5927c2d57 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa51b2d3ce7f5bc1677b996b2aa83581 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa51b2d3ce7f5bc1677b996b2aa83581 new file mode 100644 index 0000000000..f3f2b2db12 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fa51b2d3ce7f5bc1677b996b2aa83581 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/faaa9796ef2e7d9212880f8e77b100f8 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/faaa9796ef2e7d9212880f8e77b100f8 new file mode 100644 index 0000000000..2f7d5347e1 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/faaa9796ef2e7d9212880f8e77b100f8 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fb5212e61fa733a2d203dff8509138da b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fb5212e61fa733a2d203dff8509138da new file mode 100644 index 0000000000..13cb0692fa Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fb5212e61fa733a2d203dff8509138da differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fbfa767e78594a2841a4e0d2ef58cb58 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fbfa767e78594a2841a4e0d2ef58cb58 new file mode 100644 index 0000000000..9cd6a6c9b8 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fbfa767e78594a2841a4e0d2ef58cb58 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fc93e97706fdb7411246d0b313dbbe6b b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fc93e97706fdb7411246d0b313dbbe6b new file mode 100644 index 0000000000..62c47d3522 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fc93e97706fdb7411246d0b313dbbe6b differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fe2333157e63e0ed167f896733520f23 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fe2333157e63e0ed167f896733520f23 new file mode 100644 index 0000000000..ed82ef3a3c Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/fe2333157e63e0ed167f896733520f23 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ff2496e7d4021e553494836fe822fe53 b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ff2496e7d4021e553494836fe822fe53 new file mode 100644 index 0000000000..f4a1fbc49b Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/d/ff2496e7d4021e553494836fe822fe53 differ diff --git a/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/manifest.ocdbt b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/manifest.ocdbt new file mode 100644 index 0000000000..69584752d0 Binary files /dev/null and b/testdata/kvstore/ocdbt/multi_version_low_arity.ocdbt/manifest.ocdbt differ diff --git a/testdata/kvstore/zip/files.zip b/testdata/kvstore/zip/files.zip new file mode 100644 index 0000000000..e0d4b95520 Binary files /dev/null and b/testdata/kvstore/zip/files.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/README.txt b/testdata/kvstore/zip/from-yauzl/README.txt new file mode 100644 index 0000000000..9b00947bca --- /dev/null +++ b/testdata/kvstore/zip/from-yauzl/README.txt @@ -0,0 +1,25 @@ +The test data in this directory were copied from yauzl +(https://github.com/thejoshwolfe/yauzl/) and are subject to the following +license: + +The MIT License (MIT) + +Copyright (c) 2014 Josh Wolfe + +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/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip new file mode 100644 index 0000000000..4ec82226f4 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_1.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_1.zip new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip new file mode 100644 index 0000000000..64cca97da0 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/End of central directory record signature not found Either not a zip file or file is truncated_2.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip b/testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip new file mode 100644 index 0000000000..c64c3fa9d4 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/compressed uncompressed size mismatch for stored file 2147483647 5.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/expected zip64 extended information extra field.zip b/testdata/kvstore/zip/from-yauzl/failure/expected zip64 extended information extra field.zip new file mode 100644 index 0000000000..cec1d03be5 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/expected zip64 extended information extra field.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip b/testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip new file mode 100644 index 0000000000..3109f86a67 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/extra field length exceeds extra field buffer size.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip b/testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip new file mode 100644 index 0000000000..5f63af9264 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/file data overflows file bounds 63 2147483647 308.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/invalid central directory file header signature 0x1014b50.zip b/testdata/kvstore/zip/from-yauzl/failure/invalid central directory file header signature 0x1014b50.zip new file mode 100644 index 0000000000..dcd0347a80 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/invalid central directory file header signature 0x1014b50.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip b/testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip new file mode 100644 index 0000000000..8393a9dd3b Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/invalid local file header signature 0x3034b50.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip b/testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip new file mode 100644 index 0000000000..263895aa05 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/invalid zip64 end of central directory record signature.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip b/testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip new file mode 100644 index 0000000000..098d4e56c1 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/multi-volume zip files are not supported this is volume 1.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip b/testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip new file mode 100644 index 0000000000..08eb6cece8 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/strong encryption is not supported.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/unsupported compression method 1.zip b/testdata/kvstore/zip/from-yauzl/failure/unsupported compression method 1.zip new file mode 100644 index 0000000000..3bbd8310eb Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/unsupported compression method 1.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include compressed size.zip b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include compressed size.zip new file mode 100644 index 0000000000..375318c7cc Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include compressed size.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include relative header offset.zip b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include relative header offset.zip new file mode 100644 index 0000000000..112533a8a0 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include relative header offset.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include uncompressed size.zip b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include uncompressed size.zip new file mode 100644 index 0000000000..7b3107898d Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/failure/zip64 extended information extra field does not include uncompressed size.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/cygwin-info-zip.zip b/testdata/kvstore/zip/from-yauzl/success/cygwin-info-zip.zip new file mode 100644 index 0000000000..7dcb601c62 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/cygwin-info-zip.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/deflate.zip b/testdata/kvstore/zip/from-yauzl/success/deflate.zip new file mode 100644 index 0000000000..26c50149a7 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/deflate.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/directories.zip b/testdata/kvstore/zip/from-yauzl/success/directories.zip new file mode 100644 index 0000000000..31803cb700 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/directories.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/empty.zip b/testdata/kvstore/zip/from-yauzl/success/empty.zip new file mode 100644 index 0000000000..15cb0ecb3e Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/empty.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/linux-info-zip.zip b/testdata/kvstore/zip/from-yauzl/success/linux-info-zip.zip new file mode 100644 index 0000000000..d30d815fdd Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/linux-info-zip.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip b/testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip new file mode 100644 index 0000000000..a90d750598 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/sloppy-filenames.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip b/testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip new file mode 100644 index 0000000000..58c17d9e31 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/unicode-path-extra-field.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/unicode.zip b/testdata/kvstore/zip/from-yauzl/success/unicode.zip new file mode 100644 index 0000000000..7c4327f24f Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/unicode.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip b/testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip new file mode 100644 index 0000000000..13c55ff562 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/unix-epoch.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip b/testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip new file mode 100755 index 0000000000..f2e52985bf Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/windows-7-zip.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip b/testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip new file mode 100755 index 0000000000..c67d3a8338 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/windows-compressed-folder.zip differ diff --git a/testdata/kvstore/zip/from-yauzl/success/zip64.zip b/testdata/kvstore/zip/from-yauzl/success/zip64.zip new file mode 100644 index 0000000000..64e786ce22 Binary files /dev/null and b/testdata/kvstore/zip/from-yauzl/success/zip64.zip differ diff --git a/testdata/kvstore/zip/generate_zip.py b/testdata/kvstore/zip/generate_zip.py new file mode 100755 index 0000000000..c92fe925aa --- /dev/null +++ b/testdata/kvstore/zip/generate_zip.py @@ -0,0 +1,22 @@ +#!/usr/bin/env -S uv run +# /// script +# requires-python = ">=3.11" +# /// + +import os +import zipfile + +SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def create_zip(directory_path: str, zip_path: str): + with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_STORED) as zipf: + for root, dirs, files in os.walk(directory_path): + for filename in files: + entry_path = os.path.join(root, filename) + zipf.write(entry_path, os.path.relpath(entry_path, directory_path)) + + +create_zip( + os.path.join(SCRIPT_DIR, "..", "files"), os.path.join(SCRIPT_DIR, "files.zip") +) diff --git a/python/testdata/mesh/simple1 b/testdata/mesh/simple1 similarity index 100% rename from python/testdata/mesh/simple1 rename to testdata/mesh/simple1 diff --git a/python/testdata/mesh/simple2 b/testdata/mesh/simple2 similarity index 100% rename from python/testdata/mesh/simple2 rename to testdata/mesh/simple2 diff --git a/tests/datasource/completion.spec.ts b/tests/datasource/completion.spec.ts new file mode 100644 index 0000000000..69a18c5ab9 --- /dev/null +++ b/tests/datasource/completion.spec.ts @@ -0,0 +1,138 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import "#src/kvstore/zip/register_frontend.js"; + +import { describe, expect, test } from "vitest"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import { dataSourceProviderFixture } from "#tests/fixtures/datasource_provider.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; +import { TEST_FILES_DIR } from "#tests/kvstore/test_data.js"; + +describe("http completion", () => { + const serverFixture = httpServerFixture(constantFixture(TEST_FILES_DIR)); + const kvStoreContextFixture = sharedKvStoreContextFixture(); + test("get completions", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "%23|", + }, + { + "value": "a|", + }, + { + "value": "b|", + }, + { + "value": "c|", + }, + { + "value": "empty|", + }, + ], + "defaultCompletion": undefined, + "offset": 23, + } + `); + }); + + test("get completions with partial name", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl + "b", + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "b|", + }, + ], + "defaultCompletion": undefined, + "offset": 23, + } + `); + }); + + test("get completions with subdirectory", async () => { + const serverUrl = await serverFixture.serverUrl(); + expect( + await getKvStoreCompletions(await kvStoreContextFixture(), { + url: serverUrl + "baz/", + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "first|", + }, + { + "value": "x|", + }, + { + "value": "z|", + }, + ], + "defaultCompletion": undefined, + "offset": 27, + } + `); + }); +}); + +describe("datasource completion", () => { + const datasourceProviderFixture = dataSourceProviderFixture(); + + test("get empty completions", async () => { + expect(await (await datasourceProviderFixture()).completeUrl({ url: "" })) + .toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "http (unauthenticated)", + "value": "http://", + }, + { + "description": "https (unauthenticated)", + "value": "https://", + }, + { + "description": "Local in-memory", + "value": "local://", + }, + ], + "offset": 0, + } + `); + }); +}); diff --git a/tests/datasource/deepzoom.browser_test.ts b/tests/datasource/deepzoom.browser_test.ts new file mode 100644 index 0000000000..924ccf3547 --- /dev/null +++ b/tests/datasource/deepzoom.browser_test.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/deepzoom/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("deepzoom", ["14122_mPPC_BDA_s186.dzi"]); diff --git a/tests/datasource/metadata_snapshot_test_util.ts b/tests/datasource/metadata_snapshot_test_util.ts new file mode 100644 index 0000000000..ef7e8e2e61 --- /dev/null +++ b/tests/datasource/metadata_snapshot_test_util.ts @@ -0,0 +1,41 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import { test } from "vitest"; +import { getDatasourceMetadata } from "#tests/datasource/test_util.js"; +import { dataSourceProviderFixture } from "#tests/fixtures/datasource_provider.js"; + +declare const TEST_DATA_SERVER: string; + +export const dataSourceProvider = dataSourceProviderFixture(); + +export function datasourceMetadataSnapshotTests( + datasourceName: string, + names: string[], + basePrefix: string = `datasource/${datasourceName}/`, +) { + test.for(names)("metadata %s", async (name, { expect }) => { + await expect( + await getDatasourceMetadata( + dataSourceProvider, + `${TEST_DATA_SERVER}${basePrefix}${name}`, + ), + ).toMatchFileSnapshot( + `./metadata_snapshots/${datasourceName}/${name.replaceAll("/", "_")}.snapshot`, + ); + }); +} diff --git a/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot b/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot new file mode 100644 index 0000000000..9556efadaf --- /dev/null +++ b/tests/datasource/metadata_snapshots/deepzoom/14122_mPPC_BDA_s186.dzi.snapshot @@ -0,0 +1,1181 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186.dzi|deepzoom:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 48023, + 34907, + 3, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "c^", + ], + "scales": Float64Array [ + 1e-9, + 1e-9, + 1, + ], + "units": [ + "m", + "m", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/16/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 48023, + 34907, + 3, + ], + }, + }, + "upperClipBound": Float32Array [ + 48023, + 34907, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/15/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 24012, + 17454, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 24011.5, + 17453.5, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/14/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 12006, + 8727, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 12005.75, + 8726.75, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/13/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 6003, + 4364, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 8, + 0, + 0, + 0, + ], + [ + 0, + 8, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 6002.875, + 4363.375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/12/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3002, + 2182, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 16, + 0, + 0, + 0, + ], + [ + 0, + 16, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 3001.4375, + 2181.6875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/11/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 1501, + 1091, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 32, + 0, + 0, + 0, + ], + [ + 0, + 32, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 1500.71875, + 1090.84375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 751, + 546, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 64, + 0, + 0, + 0, + ], + [ + 0, + 64, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 750.359375, + 545.421875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/9/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 376, + 273, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 128, + 0, + 0, + 0, + ], + [ + 0, + 128, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 375.1796875, + 272.7109375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/8/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 188, + 137, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 256, + 0, + 0, + 0, + ], + [ + 0, + 256, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 187.58984375, + 136.35546875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/7/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 94, + 69, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 512, + 0, + 0, + 0, + ], + [ + 0, + 512, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 93.794921875, + 68.177734375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/6/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 47, + 35, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 1024, + 0, + 0, + 0, + ], + [ + 0, + 1024, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 46.8974609375, + 34.0888671875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 24, + 18, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2048, + 0, + 0, + 0, + ], + [ + 0, + 2048, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 23.44873046875, + 17.04443359375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/4/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 12, + 9, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4096, + 0, + 0, + 0, + ], + [ + 0, + 4096, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 11.724365234375, + 8.522216796875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/3/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 6, + 5, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 8192, + 0, + 0, + 0, + ], + [ + 0, + 8192, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 5.8621826171875, + 4.2611083984375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 3, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 16384, + 0, + 0, + 0, + ], + [ + 0, + 16384, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 2.93109130859375, + 2.13055419921875, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 32768, + 0, + 0, + 0, + ], + [ + 0, + 32768, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 1.465545654296875, + 1.065277099609375, + 3, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "format": "jpg", + "overlap": 1, + "tilesize": 254, + "url": "http://localhost:*/datasource/deepzoom/14122_mPPC_BDA_s186_files/0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 254, + 254, + 3, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 1, + 1, + 3, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 65536, + 0, + 0, + 0, + ], + [ + 0, + 65536, + 0, + 0, + ], + [ + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "upperClipBound": Float32Array [ + 0.7327728271484375, + 0.5326385498046875, + 3, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 48023, + 34907, + 3, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot new file mode 100644 index 0000000000..f391dcfe50 --- /dev/null +++ b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_deprecated.snapshot @@ -0,0 +1,194 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/|n5:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "x", + "y", + ], + "scales": Float64Array [ + 1e-8, + 20, + ], + "units": [ + "m", + "s", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + ], + }, + }, + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + ], + [ + 0, + 2, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_deprecated/s2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + ], + [ + 0, + 4, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 10, + 20, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot new file mode 100644 index 0000000000..aca3867952 --- /dev/null +++ b/tests/datasource/metadata_snapshots/n5/n5_viewer_multiscale_modern.snapshot @@ -0,0 +1,194 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/|n5:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "x", + "y", + ], + "scales": Float64Array [ + 1e-8, + 20, + ], + "units": [ + "m", + "s", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s0/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + ], + }, + }, + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s1/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + ], + [ + 0, + 2, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 3, + "url": "http://localhost:*/datasource/n5/n5_viewer_multiscale_modern/s2/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + ], + [ + 0, + 4, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 10, + 20, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot b/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot new file mode 100644 index 0000000000..165e4f1203 --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/example_nifti2.nii.gz.snapshot @@ -0,0 +1,213 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/example_nifti2.nii.gz|gzip:|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 32, + 20, + 12, + 2, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "i", + "j", + "k", + "m", + ], + "scales": Float64Array [ + 0.002, + 0.002, + 0.0021999990940093994, + 2000, + ], + "units": [ + "m", + "m", + "m", + "s", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "x", + "y", + "z", + "t", + ], + "scales": Float64Array [ + 0.001, + 0.001, + 0.001, + 1, + ], + "units": [ + "m", + "m", + "m", + "s", + ], + "valid": true, + }, + "transform": [ + [ + -1, + 0.000005141198016644921, + 0.00006320902321022004, + 0, + 117.8551025390625, + ], + [ + -0.000005141198016644921, + 0.9868557453155518, + -0.16160380840301514, + 0, + -35.72294235229492, + ], + [ + 0.00006320902321022004, + 0.16160380840301514, + 0.9868557453155518, + 0, + -7.248798370361328, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "INT16", + "rank": 4, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/example_nifti2.nii.gz|gzip:", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 32, + 20, + 12, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "INT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 32, + 20, + 12, + 2, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + 0, + ], + "pointB": [ + 32, + 20, + 12, + 2, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot b/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot new file mode 100644 index 0000000000..ae3792a1a4 --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/standard.nii.gz.snapshot @@ -0,0 +1,156 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/standard.nii.gz|gzip:|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 4, + 5, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "i", + "j", + "k", + ], + "scales": Float64Array [ + 1, + 3, + 2, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 1, + 1, + 1, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/standard.nii.gz|gzip:", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 4, + 5, + 7, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 4, + 5, + 7, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 4, + 5, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot b/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot new file mode 100644 index 0000000000..3c57057f7b --- /dev/null +++ b/tests/datasource/metadata_snapshots/nifti/standard.nii.snapshot @@ -0,0 +1,156 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/nifti/standard.nii|nifti:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 4, + 5, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "i", + "j", + "k", + ], + "scales": Float64Array [ + 1, + 3, + 2, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + "outputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -Infinity, + -Infinity, + -Infinity, + ], + "upperBounds": Float64Array [ + Infinity, + Infinity, + Infinity, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 1, + 1, + 1, + ], + "units": [ + "", + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/nifti/standard.nii", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 4, + 5, + 7, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 4, + 5, + 7, + ], + }, + }, + }, + ], + ], + "volumeType": "UNKNOWN", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 4, + 5, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot b/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot new file mode 100644 index 0000000000..df3b27612c --- /dev/null +++ b/tests/datasource/metadata_snapshots/precomputed/one_channel.snapshot @@ -0,0 +1,266 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/precomputed/one_channel/|neuroglancer-precomputed:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + 30, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + ], + "names": [ + "x", + "y", + "z", + ], + "scales": Float64Array [ + 3e-9, + 4e-9, + 5e-9, + ], + "units": [ + "m", + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 3, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/3_4_5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + 30, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + 30, + ], + }, + }, + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 10, + 20, + 30, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/6_8_10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + 15, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + 15, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 2, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 5, + 10, + 15, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/one_channel/12_16_20/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + 8, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + 8, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 4, + 0, + ], + [ + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 2.5, + 5, + 7.5, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + ], + "pointB": [ + 10, + 20, + 30, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot b/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot new file mode 100644 index 0000000000..1b252e1674 --- /dev/null +++ b/tests/datasource/metadata_snapshots/precomputed/two_channels.snapshot @@ -0,0 +1,315 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/precomputed/two_channels/|neuroglancer-precomputed:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + 0, + 0, + ], + "upperBounds": Float64Array [ + 10, + 20, + 30, + 2, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + false, + false, + ], + }, + "coordinateArrays": [ + , + , + , + , + ], + "names": [ + "x", + "y", + "z", + "c^", + ], + "scales": Float64Array [ + 3e-9, + 4e-9, + 5e-9, + 1, + ], + "units": [ + "m", + "m", + "m", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 4, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/3_4_5/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 10, + 20, + 30, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 20, + 30, + 2, + ], + }, + }, + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 10, + 20, + 30, + 2, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/6_8_10/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 5, + 10, + 15, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 10, + 15, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 2, + 0, + 0, + 0, + 0, + ], + [ + 0, + 2, + 0, + 0, + 0, + ], + [ + 0, + 0, + 2, + 0, + 0, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 5, + 10, + 15, + 2, + ], + }, + { + "chunkSource": { + "parameters": { + "encoding": 0, + "sharding": undefined, + "url": "http://localhost:*/datasource/precomputed/two_channels/12_16_20/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + 0, + 0, + ], + "chunkDataSize": [ + 3, + 5, + 8, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + 0, + 0, + ], + "upperVoxelBound": [ + 3, + 5, + 8, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 4, + 0, + 0, + 0, + 0, + ], + [ + 0, + 4, + 0, + 0, + 0, + ], + [ + 0, + 0, + 4, + 0, + 0, + ], + [ + 0, + 0, + 0, + 1, + 0, + ], + [ + 0, + 0, + 0, + 0, + 1, + ], + ], + "lowerClipBound": Float32Array [ + 0, + 0, + 0, + 0, + ], + "upperClipBound": Float32Array [ + 2.5, + 5, + 7.5, + 2, + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + 0, + 0, + ], + "pointB": [ + 10, + 20, + 30, + 2, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/icechunk_single_array.icechunk.snapshot b/tests/datasource/metadata_snapshots/zarr/icechunk_single_array.icechunk.snapshot new file mode 100644 index 0000000000..166955a732 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/icechunk_single_array.icechunk.snapshot @@ -0,0 +1,120 @@ +{ + "canonicalUrl": "http://localhost:*/kvstore/icechunk/single_array.icechunk/|icechunk:|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 6, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "dim_0", + "dim_1", + ], + "scales": Float64Array [ + 1, + 1, + ], + "units": [ + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT8", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/kvstore/icechunk/single_array.icechunk/|icechunk:", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 4, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT8", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 7, + 6, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + 0, + ], + [ + 1, + 0, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 6, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot new file mode 100644 index 0000000000..2a04b75837 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.4.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/|zarr2:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.4/scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.ocdbt.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.ocdbt.snapshot new file mode 100644 index 0000000000..a5b56cc03f --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.ocdbt.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.ocdbt/|ocdbt:|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.ocdbt/|ocdbt:scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.ocdbt/|ocdbt:scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.ocdbt/|ocdbt:scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot new file mode 100644 index 0000000000..fe94094414 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5/scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.zip.snapshot b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.zip.snapshot new file mode 100644 index 0000000000..17fab26c74 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/ome_zarr_simple_0.5.zip.snapshot @@ -0,0 +1,208 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.zip|zip:|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + -0.5, + -0.5, + ], + "upperBounds": Float64Array [ + 9.5, + 9.5, + ], + "voxelCenterAtIntegerCoordinates": [ + true, + true, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "y", + "x", + ], + "scales": Float64Array [ + 4e-9, + 3.0000000000000004e-8, + ], + "units": [ + "m", + "m", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.zip|zip:scale0/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 10, + 10, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 10, + 10, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + -0.5, + ], + [ + 1, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.zip|zip:scale1/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 5, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 5, + 5, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 2, + -0.5, + ], + [ + 2, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/ome_zarr/simple_0.5.zip|zip:scale2/image/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 2, + 2, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 2, + 2, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 4, + -0.5, + ], + [ + 4, + 0, + -0.5, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + -0.5, + -0.5, + ], + "pointB": [ + 9.5, + 9.5, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot b/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot new file mode 100644 index 0000000000..61d179dcc5 --- /dev/null +++ b/tests/datasource/metadata_snapshots/zarr/zarr_v3_examples_single_res.snapshot @@ -0,0 +1,120 @@ +{ + "canonicalUrl": "http://localhost:*/datasource/zarr/zarr_v3/examples/single_res/|zarr3:", + "modelTransform": { + "inputSpace": { + "bounds": { + "lowerBounds": Float64Array [ + 0, + 0, + ], + "upperBounds": Float64Array [ + 6, + 7, + ], + "voxelCenterAtIntegerCoordinates": [ + false, + false, + ], + }, + "coordinateArrays": [ + , + , + ], + "names": [ + "dim_0", + "dim_1", + ], + "scales": Float64Array [ + 1, + 1, + ], + "units": [ + "", + "", + ], + "valid": true, + }, + }, + "subsources": [ + { + "default": true, + "id": "default", + "subsource": { + "volume": { + "dataType": "UINT16", + "rank": 2, + "sources": [ + [ + { + "chunkSource": { + "parameters": { + "url": "http://localhost:*/datasource/zarr/zarr_v3/examples/single_res/", + }, + "spec": { + "baseVoxelOffset": [ + 0, + 0, + ], + "chunkDataSize": [ + 5, + 4, + ], + "compressedSegmentationBlockSize": undefined, + "dataType": "UINT16", + "lowerVoxelBound": [ + 0, + 0, + ], + "upperVoxelBound": [ + 7, + 6, + ], + }, + }, + "chunkToMultiscaleTransform": [ + [ + 0, + 1, + 0, + ], + [ + 1, + 0, + 0, + ], + [ + 0, + 0, + 1, + ], + ], + }, + ], + ], + "volumeType": "IMAGE", + }, + }, + }, + { + "default": true, + "id": "bounds", + "subsource": { + "staticAnnotations": [ + { + "description": "Data Bounds", + "id": "data-bounds", + "pointA": [ + 0, + 0, + ], + "pointB": [ + 6, + 7, + ], + "type": "axis_aligned_bounding_box", + }, + ], + }, + }, + ], +} \ No newline at end of file diff --git a/tests/datasource/n5.browser_test.ts b/tests/datasource/n5.browser_test.ts new file mode 100644 index 0000000000..1de2f252a4 --- /dev/null +++ b/tests/datasource/n5.browser_test.ts @@ -0,0 +1,24 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/n5/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("n5", [ + "n5_viewer_multiscale_deprecated", + "n5_viewer_multiscale_modern", +]); diff --git a/tests/datasource/nifti.browser_test.ts b/tests/datasource/nifti.browser_test.ts new file mode 100644 index 0000000000..430f745b46 --- /dev/null +++ b/tests/datasource/nifti.browser_test.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/nifti/register_default.js"; +import "#src/kvstore/gzip/register.js"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("nifti", [ + "standard.nii", + "standard.nii.gz", + "example_nifti2.nii.gz", +]); diff --git a/tests/datasource/precomputed.browser_test.ts b/tests/datasource/precomputed.browser_test.ts new file mode 100644 index 0000000000..735bbe16da --- /dev/null +++ b/tests/datasource/precomputed.browser_test.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/precomputed/register_default"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("precomputed", ["one_channel", "two_channels"]); diff --git a/tests/datasource/suggest_name.spec.ts b/tests/datasource/suggest_name.spec.ts new file mode 100644 index 0000000000..a9128e05f4 --- /dev/null +++ b/tests/datasource/suggest_name.spec.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect, test } from "vitest"; +import { dataSourceProviderFixture } from "#tests/fixtures/datasource_provider.js"; + +const datasourceProviderFixture = dataSourceProviderFixture(); + +test.for([ + ["http://localhost/path/to/array/|zarr3:", "array"], + ["http://localhost/path/to/array/", "array"], + ["http://localhost/path/to/array", "array"], + ["http://localhost/path/to/group/|zarr3:path/to/array/", "array"], + ["brainmaps://foo:bar:baz", "baz"], +])("%s -> %s", async ([url, expectedName]) => { + const registry = await datasourceProviderFixture(); + expect(registry.suggestLayerName(url)).toEqual(expectedName); +}); diff --git a/tests/datasource/test_util.ts b/tests/datasource/test_util.ts new file mode 100644 index 0000000000..66b804ada5 --- /dev/null +++ b/tests/datasource/test_util.ts @@ -0,0 +1,184 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { + CoordinateSpace, + CoordinateSpaceTransform, +} from "#src/coordinate_transform.js"; +import { coordinateSpacesEqual } from "#src/coordinate_transform.js"; +import type { + DataSource, + DataSourceRegistry, + DataSubsource, + DataSubsourceEntry, +} from "#src/datasource/index.js"; +import type { SliceViewSingleResolutionSource } from "#src/sliceview/frontend.js"; +import { VolumeType } from "#src/sliceview/volume/base.js"; +import type { MultiscaleVolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { VolumeChunkSource } from "#src/sliceview/volume/frontend.js"; +import { DataType } from "#src/util/data_type.js"; +import * as matrix from "#src/util/matrix.js"; +import type { ProgressListener } from "#src/util/progress_listener.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; + +export function getDatasourceSnapshot(datasource: DataSource) { + return { + subsources: Array.from(datasource.subsources, getSubsourceEntrySnapshot), + modelTransform: getCoordinateSpaceTransformSnapshot( + datasource.modelTransform, + ), + canonicalUrl: redactUrl(datasource.canonicalUrl), + ...getKeys(datasource, ["canChangeModelSpaceRank"]), + }; +} + +function getKeys(x: T, keys: Array) { + return Object.fromEntries( + keys + .map((key) => [key, x[key]]) + .filter(([_key, value]) => value !== undefined), + ); +} + +function getCoordinateSpaceSnapshot(x: CoordinateSpace) { + return getKeys(x, [ + "valid", + "names", + "units", + "scales", + "bounds", + "coordinateArrays", + ]); +} + +function getCoordinateSpaceTransformSnapshot(x: CoordinateSpaceTransform) { + const { rank } = x; + const result: any = {}; + result.inputSpace = getCoordinateSpaceSnapshot(x.inputSpace); + if (!coordinateSpacesEqual(x.inputSpace, x.outputSpace)) { + result.outputSpace = getCoordinateSpaceSnapshot(x.outputSpace); + } + if (!matrix.isIdentity(x.transform, rank + 1, rank + 1)) { + result.transform = getMatrixSnapshot(x.transform, rank + 1); + } + return result; +} + +function getMatrixSnapshot(matrix: ArrayLike, rows: number) { + const result: number[][] = []; + const cols = matrix.length / rows; + for (let row = 0; row < rows; ++row) { + const rowElements: number[] = []; + for (let col = 0; col < cols; ++col) { + rowElements[col] = matrix[col * rows + row]; + } + result[row] = rowElements; + } + return result; +} + +function getSubsourceEntrySnapshot(subsource: DataSubsourceEntry) { + return { + subsource: getSubsourceSnapshot(subsource.subsource), + ...getKeys(subsource, [ + "default", + "id", + "modelSubspaceDimensionIndices", + "subsourceToModelSubspaceTransform", + ]), + }; +} + +function getSubsourceSnapshot(subsource: DataSubsource) { + if (subsource.volume) { + return { volume: getVolumeSnapshot(subsource.volume) }; + } + if (subsource.staticAnnotations) { + return { staticAnnotations: subsource.staticAnnotations.toJSON() }; + } + return {}; +} + +function getVolumeSnapshot(volume: MultiscaleVolumeChunkSource) { + const sources = volume.getSources({ + multiscaleToViewTransform: matrix.createIdentity(Float32Array, volume.rank), + displayRank: volume.rank, + modelChannelDimensionIndices: [], + }); + return { + dataType: DataType[volume.dataType], + volumeType: VolumeType[volume.volumeType], + rank: volume.rank, + sources: sources.map((sourceList) => sourceList.map(getSourceSnapshot)), + }; +} + +function getSourceSnapshot( + source: SliceViewSingleResolutionSource, +) { + const rank = source.chunkSource.spec.rank; + let spec: any = VolumeChunkSource.encodeSpec(source.chunkSource.spec); + spec = { ...spec, dataType: DataType[spec.dataType] }; + const parameters = (source.chunkSource as any).parameters; + delete parameters.metadata; + if (parameters.url) { + parameters.url = redactUrl(parameters.url as string); + } + const result: any = { + ...getKeys(source, ["lowerClipBound", "upperClipBound"]), + chunkSource: { + parameters: (source.chunkSource as any).parameters, + spec, + }, + }; + if ( + !matrix.isIdentity(source.chunkToMultiscaleTransform, rank + 1, rank + 1) + ) { + result.chunkToMultiscaleTransform = getMatrixSnapshot( + source.chunkToMultiscaleTransform, + rank + 1, + ); + } + return result; +} + +function redactUrl(x: string | undefined): string | undefined { + if (x === undefined) return undefined; + return x.replaceAll(/(?<=http:\/\/localhost:)[0-9]+/g, "*"); +} + +export function loggingProgressListener(): ProgressListener { + return { + addSpan(span) { + console.log(`[progress] ${span.message}`); + }, + removeSpan(_span) {}, + }; +} + +export async function getDatasourceMetadata( + dataSourceProvider: Fixture, + url: string, +) { + const provider = await dataSourceProvider(); + const dataSource = await provider.get({ + url, + globalCoordinateSpace: undefined as any, + transform: undefined, + progressListener: loggingProgressListener(), + }); + return getDatasourceSnapshot(dataSource); +} diff --git a/tests/datasource/zarr.browser_test.ts b/tests/datasource/zarr.browser_test.ts new file mode 100644 index 0000000000..2d1f5603af --- /dev/null +++ b/tests/datasource/zarr.browser_test.ts @@ -0,0 +1,36 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/datasource/zarr/register_default.js"; +import "#src/kvstore/icechunk/register_frontend.js"; +import "#src/kvstore/zip/register_frontend.js"; +import "#src/kvstore/ocdbt/register_frontend.js"; +import "#src/sliceview/uncompressed_chunk_format.js"; +import { datasourceMetadataSnapshotTests } from "#tests/datasource/metadata_snapshot_test_util.js"; + +datasourceMetadataSnapshotTests("zarr", [ + "zarr_v3/examples/single_res", + "ome_zarr/simple_0.4", + "ome_zarr/simple_0.5", + "ome_zarr/simple_0.5.zip", + "ome_zarr/simple_0.5.ocdbt", +]); + +datasourceMetadataSnapshotTests( + "zarr", + ["icechunk/single_array.icechunk"], + "kvstore/", +); diff --git a/tests/example_project_test/build_client.ts b/tests/example_project_test/build_client.ts new file mode 100644 index 0000000000..1e9751cd38 --- /dev/null +++ b/tests/example_project_test/build_client.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Builds an example client. +// +// This is used as a setup routine prior to capturing a screenshot. + +import { execFileSync } from "node:child_process"; +import { test } from "#tests/example_project_test/client_test_options.js"; + +test("build client", async ({ clientDir, clientBuildOptions }) => { + test.slow(); + // Use execFileSync because it supports an `stdio` option. + execFileSync("npm", ["run", "build", "--", ...clientBuildOptions], { + cwd: clientDir, + stdio: ["ignore", "inherit", "inherit"], + }); +}); diff --git a/tests/example_project_test/build_package.ts b/tests/example_project_test/build_package.ts new file mode 100644 index 0000000000..888d99227b --- /dev/null +++ b/tests/example_project_test/build_package.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Builds the Neuroglancer JavaScript package. +// +// This is used as a setup routine for examples that depend on the built +// JavaScript package. + +import { test } from "@playwright/test"; +import { buildPackage } from "build_tools/build-package.js"; + +test("build package", async () => { + await buildPackage({ + skipDeclarations: true, + }); +}); diff --git a/tests/example_project_test/capture_build_screenshot.ts b/tests/example_project_test/capture_build_screenshot.ts new file mode 100644 index 0000000000..d16b3c2ba4 --- /dev/null +++ b/tests/example_project_test/capture_build_screenshot.ts @@ -0,0 +1,37 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import path from "node:path"; +import { captureNeuroglancerScreenshot } from "#tests/example_project_test/capture_screenshot.js"; +import { test } from "#tests/example_project_test/client_test_options.js"; + +test.use({ baseURL: "http://localhost:1/" }); + +test("capture screenshot from built client", async ({ + page, + clientDir, +}, testInfo) => { + await page.route("/**", (route, request) => { + let { pathname } = new URL(request.url()); + if (pathname === "/") { + pathname = "/index.html"; + } + return route.fulfill({ + path: path.join(clientDir, pathname), + }); + }); + await captureNeuroglancerScreenshot(page, "/", testInfo); +}); diff --git a/tests/example_project_test/capture_dev_server_screenshot.ts b/tests/example_project_test/capture_dev_server_screenshot.ts new file mode 100644 index 0000000000..ba5af5f705 --- /dev/null +++ b/tests/example_project_test/capture_dev_server_screenshot.ts @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawn, exec } from "node:child_process"; +import readline from "node:readline"; +import { stripVTControlCharacters, promisify } from "node:util"; +import { expect } from "@playwright/test"; +import { captureNeuroglancerScreenshot } from "#tests/example_project_test/capture_screenshot.js"; +import { test as base } from "#tests/example_project_test/client_test_options.js"; + +const execAsync = promisify(exec); + +const test = base.extend<{ devServer: string }>({ + devServer: async ({ clientDir, clientBuildOptions }, use) => { + const proc = spawn( + "npm", + ["run", "dev-server", "--", ...clientBuildOptions], + { cwd: clientDir, stdio: ["ignore", "pipe", "pipe"], detached: true }, + ); + try { + const { resolve, reject, promise } = Promise.withResolvers(); + for (const channel of ["stdout", "stderr"] as const) { + (async () => { + for await (const line of readline.createInterface({ + input: proc[channel], + })) { + console.log(`[dev-server ${channel}]: ${line}`); + const m = line.match(/http:\/\/[^,\s]+/); + if (m !== null) { + const url = stripVTControlCharacters(m[0]); + console.log(`Dev server is listening at ${url}`); + resolve(url); + } + } + reject(new Error("Failed to start server")); + })(); + } + await use(await promise); + } finally { + const pid = proc.pid; + if (pid !== undefined) { + if (process.platform !== "win32") { + process.kill(-pid); + } else { + await execAsync(`taskkill /PID ${pid} /T /F`); + } + } + } + }, +}); + +test("capture screenshot from built client", async ({ + page, + devServer, +}, testInfo) => { + await expect + .poll( + async () => { + try { + const response = await fetch(devServer); + return response.status; + } catch { + return 0; + } + }, + { timeout: 30000, message: "Waiting for dev server to be ready" }, + ) + .toBe(200); + await captureNeuroglancerScreenshot(page, devServer, testInfo); +}); diff --git a/tests/example_project_test/capture_screenshot.ts b/tests/example_project_test/capture_screenshot.ts new file mode 100644 index 0000000000..25f44ce7d3 --- /dev/null +++ b/tests/example_project_test/capture_screenshot.ts @@ -0,0 +1,60 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import crypto from "node:crypto"; +import type { Page, TestInfo } from "@playwright/test"; +import { expect } from "@playwright/test"; +import { sendScreenshotServerCommand } from "#tests/example_project_test/screenshot_comparison_server.js"; + +const TEST_FRAGMENT = + "#!%7B%22dimensions%22:%7B%22x%22:%5B8e-9%2C%22m%22%5D%2C%22y%22:%5B8e-9%2C%22m%22%5D%2C%22z%22:%5B8e-9%2C%22m%22%5D%7D%2C%22position%22:%5B22316.904296875%2C21921.87890625%2C24029.763671875%5D%2C%22crossSectionScale%22:1%2C%22crossSectionDepth%22:-37.62185354999912%2C%22projectionOrientation%22:%5B-0.1470303237438202%2C0.5691322684288025%2C0.19562694430351257%2C0.7849844694137573%5D%2C%22projectionScale%22:118020.30607575581%2C%22layers%22:%5B%7B%22type%22:%22image%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/emdata/clahe_yz/jpeg%22%2C%22tab%22:%22rendering%22%2C%22crossSectionRenderScale%22:4%2C%22name%22:%22emdata%22%7D%2C%7B%22type%22:%22segmentation%22%2C%22source%22:%22precomputed://gs://neuroglancer-janelia-flyem-hemibrain/v1.0/segmentation%22%2C%22tab%22:%22rendering%22%2C%22segments%22:%5B%221944507292%22%5D%2C%22name%22:%22segmentation%22%7D%5D%2C%22showSlices%22:false%2C%22selectedLayer%22:%7B%22layer%22:%22emdata%22%7D%2C%22layout%22:%22xy-3d%22%2C%22statistics%22:%7B%22size%22:232%7D%7D"; + +async function postScreenshotResult(screenshot: Buffer, projectName: string) { + const hash = crypto.createHash("sha256"); + hash.update(screenshot); + const digest = hash.digest("hex"); + await sendScreenshotServerCommand(`/${projectName}/${digest}`, { + method: "PUT", + }); +} + +export async function captureNeuroglancerScreenshot( + page: Page, + url: string, + testInfo: TestInfo, + testFragment: string = TEST_FRAGMENT, +) { + await page.goto(url + testFragment); + + await expect + .poll( + async () => + page.evaluate(() => { + try { + const viewer = (globalThis as any).viewer; + return typeof viewer !== "undefined" && viewer.isReady(); + } catch { + return false; + } + }), + { message: "Waiting for data to load in Neuroglancer", timeout: 30000 }, + ) + .toBeTruthy(); + + const screenshot = await page.screenshot(); + testInfo.attach("screenshot", { body: screenshot, contentType: "image/png" }); + await postScreenshotResult(screenshot, testInfo.project.name); +} diff --git a/tests/example_project_test/client_test_options.ts b/tests/example_project_test/client_test_options.ts new file mode 100644 index 0000000000..8f86ef47db --- /dev/null +++ b/tests/example_project_test/client_test_options.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test as base } from "@playwright/test"; + +export interface ClientTestOptions { + clientDir: string; + clientBuildOptions: string[]; +} + +export const test = base.extend({ + clientDir: ["/dev/null/invalid", { option: true }], + clientBuildOptions: [[], { option: true }], +}); diff --git a/tests/example_project_test/compare_screenshots.ts b/tests/example_project_test/compare_screenshots.ts new file mode 100644 index 0000000000..3d75fd3b17 --- /dev/null +++ b/tests/example_project_test/compare_screenshots.ts @@ -0,0 +1,32 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from "@playwright/test"; +import { sendScreenshotServerCommand } from "#tests/example_project_test/screenshot_comparison_server.js"; + +test("compare screenshots", async () => { + const results: { name: string; value: string }[] = await ( + await sendScreenshotServerCommand("", {}) + ).json(); + const map = new Map(); + for (const { name, value } of results) { + const names = map.get(value) ?? []; + map.set(value, names); + names.push(name); + } + const groups = Array.from(map.values()); + expect(groups).toHaveLength(1); +}); diff --git a/tests/example_project_test/config.ts b/tests/example_project_test/config.ts new file mode 100644 index 0000000000..1f2568f071 --- /dev/null +++ b/tests/example_project_test/config.ts @@ -0,0 +1,142 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import path from "node:path"; +import type { Project } from "@playwright/test"; +import { defineConfig } from "@playwright/test"; +import type { ClientTestOptions } from "#tests/example_project_test/client_test_options.js"; +import { maybeStartScreenshotComparisonServer } from "#tests/example_project_test/screenshot_comparison_server.js"; + +const ROOT_DIR = path.join(import.meta.dirname, "..", ".."); + +const EXAMPLES_DIR = path.join(ROOT_DIR, "examples"); + +const EXAMPLE_BUNDLERS = ["rsbuild", "rspack", "vite", "webpack"]; + +await maybeStartScreenshotComparisonServer(); + +interface ClientOptions { + name: string; + clientDir: string; + clientBuildOptions?: string[]; + distDir: string; + installNodeModulesDependencies?: string[]; + buildPackageDependencies?: string[]; +} + +const [EXAMPLE_PROJECTS_BUILT, EXAMPLE_PROJECTS_SOURCE] = [ + "built", + "source", +].map((kind) => + EXAMPLE_BUNDLERS.map((bundler): ClientOptions => { + const name = `${bundler}-project-${kind}`; + return { + name, + clientDir: path.join(EXAMPLES_DIR, bundler, name), + distDir: "dist", + installNodeModulesDependencies: [`${name}:install_node_modules`], + buildPackageDependencies: + kind === "built" ? ["build_package"] : undefined, + }; + }), +); + +const EXAMPLE_PROJECTS = [ + ...EXAMPLE_PROJECTS_SOURCE, + ...EXAMPLE_PROJECTS_BUILT, +]; + +const ROOT_CLIENT: ClientOptions = { + name: "root", + clientDir: ROOT_DIR, + clientBuildOptions: ["--no-lint", "--no-typecheck"], + distDir: "dist/client", +}; + +const CLIENTS = [ROOT_CLIENT, ...EXAMPLE_PROJECTS]; + +type ClientTestProject = Project; + +export default defineConfig({ + projects: [ + { + name: "build_package", + testDir: "tests/example_project_test", + testMatch: /build_package\.ts/, + }, + ...EXAMPLE_PROJECTS.map( + ({ name, clientDir, buildPackageDependencies }): ClientTestProject => ({ + name: `${name}:install_node_modules`, + testDir: "tests/example_project_test", + testMatch: /install_node_modules\.ts/, + dependencies: buildPackageDependencies, + use: { clientDir }, + }), + ), + ...CLIENTS.map( + ({ + name, + clientDir, + clientBuildOptions, + installNodeModulesDependencies, + }): ClientTestProject => ({ + name: `${name}:build_client`, + testDir: "tests/example_project_test", + testMatch: /build_client\.ts/, + use: { clientDir, clientBuildOptions }, + dependencies: installNodeModulesDependencies, + }), + ), + ...CLIENTS.map( + ({ name, clientDir, distDir }): ClientTestProject => ({ + name: `${name}:capture_build_screenshot`, + testDir: "tests/example_project_test", + testMatch: /capture_build_screenshot\.ts/, + use: { clientDir: path.join(clientDir, distDir) }, + dependencies: [`${name}:build_client`, "reset_screenshots"], + teardown: "compare_screenshots", + }), + ), + ...CLIENTS.map( + ({ + name, + clientDir, + clientBuildOptions, + installNodeModulesDependencies, + }): ClientTestProject => ({ + name: `${name}:capture_dev_server_screenshot`, + testDir: "tests/example_project_test", + testMatch: /capture_dev_server_screenshot\.ts/, + use: { clientDir, clientBuildOptions }, + dependencies: [ + ...(installNodeModulesDependencies ?? []), + "reset_screenshots", + ], + teardown: "compare_screenshots", + }), + ), + { + name: "reset_screenshots", + testDir: "tests/example_project_test", + testMatch: /reset_screenshot_server\.ts/, + }, + { + name: "compare_screenshots", + testDir: "tests/example_project_test", + testMatch: /compare_screenshots\.ts/, + }, + ], +}); diff --git a/tests/example_project_test/install_node_modules.ts b/tests/example_project_test/install_node_modules.ts new file mode 100644 index 0000000000..4d25246bfb --- /dev/null +++ b/tests/example_project_test/install_node_modules.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Installs NPM dependencies for an example. +// +// This is used as a setup routine for examples. + +import { execFileSync } from "node:child_process"; +import { test } from "#tests/example_project_test/client_test_options.js"; + +test("install node modules", async ({ clientDir }) => { + test.slow(); + // Use execFileSync because it supports an `stdio` option. + execFileSync("pnpm", ["install", "--frozen-lockfile"], { + cwd: clientDir, + stdio: ["ignore", "inherit", "inherit"], + }); +}); diff --git a/tests/example_project_test/reset_screenshot_server.ts b/tests/example_project_test/reset_screenshot_server.ts new file mode 100644 index 0000000000..413215df83 --- /dev/null +++ b/tests/example_project_test/reset_screenshot_server.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import test from "@playwright/test"; +import { sendScreenshotServerCommand } from "./screenshot_comparison_server"; + +test("reset screenshot comparison server", async () => { + await sendScreenshotServerCommand("", { method: "DELETE" }); +}); diff --git a/tests/example_project_test/screenshot_comparison_server.ts b/tests/example_project_test/screenshot_comparison_server.ts new file mode 100644 index 0000000000..3c034c6f68 --- /dev/null +++ b/tests/example_project_test/screenshot_comparison_server.ts @@ -0,0 +1,85 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import crypto from "node:crypto"; +import type { AddressInfo } from "node:net"; +import express from "express"; + +export interface ScreenshotComparisonServer extends AsyncDisposable { + url: string; +} + +export function startScreenshotComparisonServer(): Promise { + const app = express(); + const token = crypto.randomBytes(32).toString("base64url"); + + const seenScreenshots: { name: string; value: string }[] = []; + + app.put(`/${token}/:name/:value`, (req, res) => { + seenScreenshots.push(req.params); + res.send(""); + }); + app.delete(`/${token}`, (_req, res) => { + seenScreenshots.length = 0; + res.send(""); + }); + app.get(`/${token}`, (_req, res) => { + res.json(seenScreenshots); + }); + + const server = app.listen(0, "localhost"); + // Don't block node from exiting while this server is running. + server.unref(); + return new Promise((resolve, reject) => { + server.on("error", reject); + server.on("listening", () => { + const port = (server.address() as AddressInfo).port; + resolve({ + url: `http://localhost:${port}/${token}`, + [Symbol.asyncDispose]: () => + new Promise((resolve) => server.close(() => resolve())), + }); + }); + }); +} + +const SCREENSHOT_SERVER_ENVVAR = + "NEUROGLANCER_PLAYWRIGHT_SCREENSHOT_COMPARISON_SERVER"; + +export async function maybeStartScreenshotComparisonServer() { + if (process.env[SCREENSHOT_SERVER_ENVVAR] === undefined) { + process.env[SCREENSHOT_SERVER_ENVVAR] = ( + await startScreenshotComparisonServer() + ).url; + } +} + +export async function sendScreenshotServerCommand( + suffix: string, + init: RequestInit, +): Promise { + const server = process.env[SCREENSHOT_SERVER_ENVVAR]; + if (server === undefined) { + throw new Error( + `Expected environment variable ${SCREENSHOT_SERVER_ENVVAR} to be set`, + ); + } + const response = await fetch(server + suffix, init); + if (response.status !== 200) { + throw new Error(`Unexpected response: ${response.status}`); + } + return response; +} diff --git a/tests/fixtures/clear_cookies.ts b/tests/fixtures/clear_cookies.ts new file mode 100644 index 0000000000..f8c05947eb --- /dev/null +++ b/tests/fixtures/clear_cookies.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; + +export function clearCookiesFixture(): Fixture { + afterEach(() => clearCookies()); + return async () => {}; +} + +export function clearCookies(): void { + document.cookie.split(";").forEach((cookie) => { + document.cookie = cookie + .replace(/^ +/, "") + .replace(/=.*/, `=;expires=${new Date(0).toUTCString()};path=/`); + }); +} diff --git a/tests/fixtures/datasource_provider.ts b/tests/fixtures/datasource_provider.ts new file mode 100644 index 0000000000..8d39316eda --- /dev/null +++ b/tests/fixtures/datasource_provider.ts @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getDefaultDataSourceProvider } from "#src/datasource/default_provider.js"; +import { type DataSourceRegistry } from "#src/datasource/index.js"; +import type { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { sharedKvStoreContextFixture } from "./shared_kvstore_context"; + +export function dataSourceProviderFixture( + sharedKvStoreContext: Fixture = sharedKvStoreContextFixture(), +): Fixture { + return fixture(async (stack) => { + const kvStoreContext = await sharedKvStoreContext(); + const provider = getDefaultDataSourceProvider({ + kvStoreContext, + credentialsManager: kvStoreContext.credentialsManager, + }); + stack.defer(() => provider.dispose()); + return provider; + }); +} diff --git a/tests/fixtures/fake_gcs_server.ts b/tests/fixtures/fake_gcs_server.ts new file mode 100644 index 0000000000..f225d6c6ae --- /dev/null +++ b/tests/fixtures/fake_gcs_server.ts @@ -0,0 +1,120 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawn } from "node:child_process"; +import readline from "node:readline"; +import { bypass, http } from "msw"; +import { beforeEach } from "vitest"; +import { fetchOk } from "#src/util/http_request.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import type { mswFixture } from "#tests/fixtures/msw"; + +function pickRandomPort() { + const minPort = 1024; + const maxPort = 65535; + return Math.round(Math.random() * (maxPort - minPort) + minPort); +} + +declare const FAKE_GCS_SERVER_BIN: string; + +export function fakeGcsServerFixture( + msw?: ReturnType, +): Fixture { + const gcsServer = fixture(async (stack) => { + const port = pickRandomPort(); + const proc = stack.use( + spawn( + FAKE_GCS_SERVER_BIN, + [ + "-backend", + "memory", + "-scheme", + "http", + "-host", + "localhost", + "-port", + `${port}`, + ], + { stdio: ["ignore", "ignore", "pipe"] }, + ), + ); + + const { resolve, reject, promise } = Promise.withResolvers(); + + (async () => { + for await (const line of readline.createInterface({ + input: proc.stderr, + })) { + console.log(`fake_gcs_server: ${line}`); + if (line.match(/server started at/)) { + resolve(); + } + } + reject(new Error("Failed to start server")); + })(); + await promise; + return `http://localhost:${port}`; + }); + if (msw !== undefined) { + beforeEach(async () => { + const serverUrl = await gcsServer(); + const PUBLIC_SERVER = "https://storage.googleapis.com"; + (await msw()).use( + http.all(`${PUBLIC_SERVER}/storage/*`, ({ request }) => { + const adjustedUrl = + serverUrl + request.url.substring(PUBLIC_SERVER.length); + return fetch(bypass(adjustedUrl, request)); + }), + ); + }); + } + return gcsServer; +} + +const DEFAULT_PROJECT = "myproject"; + +export async function createBucket( + gcs: Fixture, + bucket: string, + project: string = DEFAULT_PROJECT, +) { + await fetchOk( + bypass( + `${await gcs()}/storage/v1/b?project=${encodeURIComponent(project)}`, + { + method: "POST", + body: JSON.stringify({ name: bucket }), + }, + ), + ); +} + +export async function writeObject( + gcs: Fixture, + bucket: string, + path: string, + body: RequestInit["body"], +) { + await fetchOk( + bypass( + `${await gcs()}/upload/storage/v1/b/${encodeURIComponent(bucket)}/o?name=${encodeURIComponent(path)}&uploadType=media`, + { + method: "POST", + body: body, + }, + ), + ); +} diff --git a/tests/fixtures/fake_s3_server.ts b/tests/fixtures/fake_s3_server.ts new file mode 100644 index 0000000000..4c90c70afb --- /dev/null +++ b/tests/fixtures/fake_s3_server.ts @@ -0,0 +1,156 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { spawn } from "node:child_process"; +import nodeHttp from "node:http"; +import readline from "node:readline"; +import nodeStream from "node:stream"; +import { bypass, http } from "msw"; +import { beforeEach } from "vitest"; +import { fetchOk } from "#src/util/http_request.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import type { mswFixture } from "#tests/fixtures/msw"; + +declare const PYTHON_TEST_TOOLS_PATH: string; + +export function fakeS3ServerFixture( + options: { + msw?: ReturnType; + } = {}, +): Fixture { + const { msw } = options; + const s3Server = fixture(async (stack) => { + const proc = stack.use( + spawn( + "uv", + ["--project", PYTHON_TEST_TOOLS_PATH, "run", "moto_server", "-p", "0"], + { stdio: ["ignore", "ignore", "pipe"] }, + ), + ); + + const { resolve, reject, promise } = Promise.withResolvers(); + + (async () => { + for await (const line of readline.createInterface({ + input: proc.stderr, + })) { + console.log(`moto_server: ${line}`); + const m = line.match(/Running on (http:\/\/[^\s]+)$/); + if (m !== null) { + resolve(m[1]); + } + } + reject(new Error("Failed to start server")); + })(); + return await promise; + }); + if (msw !== undefined) { + beforeEach(async () => { + const serverUrl = await s3Server(); + (await msw()).use( + http.all( + /^https:\/\/([^/]+\.)?s3\.amazonaws\.com\/.*/, + ({ request }) => { + const parsedServerUrl = new URL(serverUrl); + const requestUrl = new URL(request.url); + const requestHost = requestUrl.host; + requestUrl.protocol = parsedServerUrl.protocol; + requestUrl.host = parsedServerUrl.host; + const headers = request.headers; + headers.set("host", requestHost); + const modifiedRequest = bypass(requestUrl.toString(), request); + const { promise, resolve, reject } = + Promise.withResolvers(); + const req = nodeHttp.request(modifiedRequest.url, { + setHost: false, + signal: modifiedRequest.signal, + headers: { + ...Object.fromEntries(modifiedRequest.headers), + host: requestHost, + }, + method: modifiedRequest.method, + }); + const requestBody = modifiedRequest.body; + req.on("error", (reason) => reject(reason)); + req.on("response", (res) => { + // Convert nodeHttp.IncomingHttpHeaders to Fetch Headers object. + const headers = new Headers(); + for (let [key, value] of Object.entries(res.headers)) { + if (!Array.isArray(value)) value = [value!]; + for (const v of value) { + headers.append(key, v); + } + } + // Convert node stream.Readable to ReadableStream. + const responseBody = new ReadableStream({ + start(controller) { + res.on("data", (chunk) => { + controller.enqueue(chunk); + }); + res.on("end", () => { + controller.close(); + }); + res.on("error", (err) => { + controller.error(err); + }); + }, + }); + resolve( + new Response(responseBody, { + status: res.statusCode, + statusText: res.statusMessage, + headers, + }), + ); + }); + if (requestBody === null) { + req.end(); + } else { + nodeStream.Readable.fromWeb(requestBody as any).pipe(req); + } + return promise; + }, + ), + ); + }); + } + return s3Server; +} + +export async function createBucket(s3: Fixture, bucket: string) { + await fetchOk( + bypass(`${await s3()}/${bucket}/`, { + method: "PUT", + headers: { + "x-amz-acl": "public-read-write", + }, + }), + ); +} + +export async function writeObject( + s3: Fixture, + bucket: string, + path: string, + body: RequestInit["body"], +) { + await fetchOk( + bypass(`${await s3()}/${bucket}/${encodeURIComponent(path)}`, { + method: "PUT", + body: body, + }), + ); +} diff --git a/tests/fixtures/fixture.ts b/tests/fixtures/fixture.ts new file mode 100644 index 0000000000..2471c8e91f --- /dev/null +++ b/tests/fixtures/fixture.ts @@ -0,0 +1,54 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "core-js/proposals/explicit-resource-management.js"; +import { beforeAll, afterAll } from "vitest"; + +export interface Fixture { + (): Promise; +} + +export function fixture( + setup: (disposableStack: AsyncDisposableStack) => Promise, +): Fixture { + let setupPromise: Promise | undefined; + const stack = new AsyncDisposableStack(); + + afterAll(async () => { + setupPromise = undefined; + await stack[Symbol.asyncDispose](); + }); + + const asyncGetter = () => { + if (setupPromise === undefined) { + setupPromise = (async () => { + return setup(stack); + })(); + } + return setupPromise; + }; + + beforeAll(async () => { + await asyncGetter(); + }); + + return asyncGetter; +} + +export function constantFixture(value: T): Fixture { + const promise = Promise.resolve(value); + return () => promise; +} diff --git a/tests/fixtures/gl_browser.ts b/tests/fixtures/gl_browser.ts new file mode 100644 index 0000000000..d7f208c42a --- /dev/null +++ b/tests/fixtures/gl_browser.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { GL } from "#src/webgl/context.js"; +import { initializeWebGL } from "#src/webgl/context.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function glFixture(): Fixture { + return fixture(async () => { + return initializeWebGL(document.createElement("canvas")); + }); +} diff --git a/tests/fixtures/gl_node.ts b/tests/fixtures/gl_node.ts new file mode 100644 index 0000000000..6da2ff7275 --- /dev/null +++ b/tests/fixtures/gl_node.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { RefCounted } from "#src/util/disposable.js"; +import { Memoize } from "#src/util/memoize.js"; +import type { GL } from "#src/webgl/context.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function glFixture(): Fixture { + return fixture(async () => { + return { memoize: new Memoize() } as any; + }); +} diff --git a/tests/fixtures/http_server.ts b/tests/fixtures/http_server.ts new file mode 100644 index 0000000000..800c546838 --- /dev/null +++ b/tests/fixtures/http_server.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type * as http from "node:http"; +import type { AddressInfo } from "node:net"; +import { createServer } from "http-server"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { tempDirectoryFixture } from "#tests/fixtures/temp_directory.js"; + +export function httpServerFixture( + rootDirectory: Fixture = tempDirectoryFixture(), +): { serverUrl: Fixture; rootDirectory: Fixture } { + return { + serverUrl: fixture(async (stack) => { + const resolvedRootDirectory = await rootDirectory(); + const server: http.Server = ( + createServer({ + root: resolvedRootDirectory, + cache: -1, + }) as any + ).server; + stack.defer(async () => { + await new Promise((resolve) => server.close(resolve)); + }); + const serverUrl = await new Promise((resolve, reject) => { + server.on("error", reject); + server.listen(0, "localhost", () => { + const port = (server.address() as AddressInfo).port; + resolve(`http://localhost:${port}/`); + }); + }); + console.log(`Serving ${resolvedRootDirectory} at ${serverUrl}`); + return serverUrl; + }), + rootDirectory, + }; +} diff --git a/tests/fixtures/msw_browser.ts b/tests/fixtures/msw_browser.ts new file mode 100644 index 0000000000..a282bbf53f --- /dev/null +++ b/tests/fixtures/msw_browser.ts @@ -0,0 +1,21 @@ +import type { LifeCycleEventsMap, SetupApi } from "msw"; +import { http, passthrough } from "msw"; +import { setupWorker, type SetupWorkerApi } from "msw/browser"; +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function mswFixture(): Fixture> { + const mswServer = fixture(async (stack) => { + const server = setupWorker( + http.get("/*", () => passthrough()), + ) as SetupWorkerApi; + stack.defer(() => server.stop()); + await server.start(); + return server; + }); + + afterEach(async () => (await mswServer()).resetHandlers()); + + return mswServer; +} diff --git a/tests/fixtures/msw_node.ts b/tests/fixtures/msw_node.ts new file mode 100644 index 0000000000..a3749e6222 --- /dev/null +++ b/tests/fixtures/msw_node.ts @@ -0,0 +1,18 @@ +import type { LifeCycleEventsMap, SetupApi } from "msw"; +import { setupServer } from "msw/node"; +import { afterEach } from "vitest"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export function mswFixture(): Fixture> { + const mswServer = fixture(async (stack) => { + const server = setupServer(); + stack.defer(() => server.close()); + server.listen(); + return server; + }); + + afterEach(async () => (await mswServer()).resetHandlers()); + + return mswServer; +} diff --git a/tests/fixtures/shared_kvstore_context.ts b/tests/fixtures/shared_kvstore_context.ts new file mode 100644 index 0000000000..7fa6538db0 --- /dev/null +++ b/tests/fixtures/shared_kvstore_context.ts @@ -0,0 +1,50 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getDefaultCredentialsManager } from "#src/credentials_provider/default_manager.js"; +import { SharedCredentialsManager } from "#src/credentials_provider/shared.js"; +import { DataManagementContext } from "#src/data_management_context.js"; +import { SharedKvStoreContext } from "#src/kvstore/frontend.js"; +import type { GL } from "#src/webgl/context.js"; +import { fixture, type Fixture } from "#tests/fixtures/fixture.js"; +import { glFixture } from "#tests/fixtures/gl"; + +export function sharedKvStoreContextFixture( + gl: Fixture = glFixture(), +): Fixture { + return fixture(async (stack) => { + const dataContext = new DataManagementContext( + /*gl=*/ await gl(), + /*frameNumberCounter=*/ undefined as any, + ); + stack.defer(() => dataContext.dispose()); + + const sharedCredentialsManager = dataContext.registerDisposer( + new SharedCredentialsManager( + getDefaultCredentialsManager(), + dataContext.rpc, + ), + ); + + const sharedKvStoreContext = new SharedKvStoreContext( + dataContext.chunkManager, + sharedCredentialsManager, + ); + stack.defer(() => sharedKvStoreContext.dispose()); + + return sharedKvStoreContext; + }); +} diff --git a/tests/fixtures/status_message_observer.ts b/tests/fixtures/status_message_observer.ts new file mode 100644 index 0000000000..78476b70ec --- /dev/null +++ b/tests/fixtures/status_message_observer.ts @@ -0,0 +1,89 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { afterEach } from "vitest"; +import type { StatusMessage } from "#src/status.js"; +import { statusMessages, getStatusMessageContainers } from "#src/status.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { fixture } from "#tests/fixtures/fixture.js"; + +export interface StatusMessageHandler { + (message: StatusMessage): void; +} +export class StatusMessageObserver { + private handlers: Set = new Set(); + private observer: MutationObserver; + constructor() { + this.observer = new MutationObserver(() => { + for (const handler of this.handlers) { + for (const message of statusMessages) { + handler(message); + } + } + }); + for (const element of getStatusMessageContainers()) { + this.observer.observe(element, { + subtree: true, + childList: true, + attributes: true, + characterData: true, + }); + } + } + registerHandler(handler: StatusMessageHandler): Disposable { + const wrappedHandler: StatusMessageHandler = (status) => handler(status); + this.handlers.add(wrappedHandler); + return { + [Symbol.dispose]: () => { + this.handlers.delete(wrappedHandler); + }, + }; + } + async waitForButton(pattern: RegExp): Promise { + const { promise, resolve } = Promise.withResolvers(); + using _handler = this.registerHandler((status) => { + const result = document.evaluate( + `.//button`, + status.element, + null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, + null, + ); + for (let i = 0, length = result.snapshotLength; i < length; ++i) { + const button = result.snapshotItem(i) as HTMLButtonElement; + if ((button.textContent ?? "").match(pattern)) { + resolve(button); + } + } + }); + return await promise; + } + reset() { + this.handlers.clear(); + } + [Symbol.dispose]() { + this.observer.disconnect(); + } +} + +export function statusMessageObserverFixture(): Fixture { + const f = fixture(async () => new StatusMessageObserver()); + afterEach(async () => { + const handler = await f(); + handler.reset(); + }); + return f; +} diff --git a/tests/fixtures/temp_directory.ts b/tests/fixtures/temp_directory.ts new file mode 100644 index 0000000000..248ab191e7 --- /dev/null +++ b/tests/fixtures/temp_directory.ts @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Vitest fixture that creates a temporary directory. + +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { type Fixture, fixture } from "#tests/fixtures/fixture.js"; + +export function tempDirectoryFixture(prefix: string = ""): Fixture { + return fixture(async (stack) => { + const tempDir = await fs.mkdtemp( + `${os.tmpdir()}${path.sep}neuroglancer-vitest-${prefix}`, + ); + stack.defer(async () => { + await fs.rm(tempDir, { recursive: true, force: true }); + }); + return tempDir; + }); +} diff --git a/tests/kvstore/gcs.spec.ts b/tests/kvstore/gcs.spec.ts new file mode 100644 index 0000000000..5bdfa62fe5 --- /dev/null +++ b/tests/kvstore/gcs.spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/gcs/register.js"; +import { beforeAll } from "vitest"; +import { + createBucket, + fakeGcsServerFixture, + writeObject, +} from "#tests/fixtures/fake_gcs_server.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { getTestFiles } from "#tests/kvstore/test_data.js"; +import { testKvStore } from "#tests/kvstore/test_util.js"; + +const msw = mswFixture(); +const fakeGcsServer = fakeGcsServerFixture(msw); + +const BUCKET = "mybucket"; + +beforeAll(async () => { + // Add data to GCS. + await createBucket(fakeGcsServer, BUCKET); + for (const [relativePath, content] of await getTestFiles()) { + await writeObject( + fakeGcsServer, + BUCKET, + relativePath, + new Uint8Array(content), + ); + } +}); + +testKvStore(constantFixture(`gs://${BUCKET}/`)); diff --git a/tests/kvstore/gzip.spec.ts b/tests/kvstore/gzip.spec.ts new file mode 100644 index 0000000000..5b3acbcfe7 --- /dev/null +++ b/tests/kvstore/gzip.spec.ts @@ -0,0 +1,36 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import "#src/kvstore/gzip/register.js"; +import { expect, test } from "vitest"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; +import { TEST_DATA_DIR } from "#tests/kvstore/test_data.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_DATA_DIR)); +const sharedKvStoreContext = sharedKvStoreContextFixture(); + +test("can read", async () => { + const { response } = await ( + await sharedKvStoreContext() + ).kvStoreContext.read( + `${await serverFixture.serverUrl()}gzip/simple.txt.gz|gzip`, + { throwIfMissing: true }, + ); + expect(await response.text()).toEqual("Hello"); +}); diff --git a/tests/kvstore/http.spec.ts b/tests/kvstore/http.spec.ts new file mode 100644 index 0000000000..99e019556f --- /dev/null +++ b/tests/kvstore/http.spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import { http, passthrough } from "msw"; +import { beforeEach, describe } from "vitest"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { TEST_FILES_DIR } from "#tests/kvstore/test_data.js"; +import { testKvStore } from "#tests/kvstore/test_util.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_FILES_DIR)); + +describe("with HEAD support", () => { + testKvStore(serverFixture.serverUrl); +}); + +describe.for([405, 501])("HEAD returns %s", (statusCode) => { + const msw = mswFixture(); + beforeEach(async () => { + const serverUrl = await serverFixture.serverUrl(); + (await msw()).use( + http.all(`${serverUrl}*`, ({ request }) => { + if (request.method === "HEAD") { + return new Response(null, { status: statusCode }); + } + return passthrough(); + }), + ); + }); + + testKvStore(serverFixture.serverUrl); +}); diff --git a/tests/kvstore/icechunk.spec.ts b/tests/kvstore/icechunk.spec.ts new file mode 100644 index 0000000000..b5bbba608c --- /dev/null +++ b/tests/kvstore/icechunk.spec.ts @@ -0,0 +1,292 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { http, passthrough } from "msw"; +import { beforeAll, describe, expect, test } from "vitest"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import { formatRefSpec, parseRefSpec } from "#src/kvstore/icechunk/url.js"; +import { listKvStoreRecursively, readKvStore } from "#src/kvstore/index.js"; +import { + createBucket, + fakeS3ServerFixture, + writeObject, +} from "#tests/fixtures/fake_s3_server.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { + sharedKvStoreContext, + testAutoDetect, +} from "#tests/kvstore/test_util.js"; + +declare const TEST_DATA_SERVER: string; + +const BASE_URL = `${TEST_DATA_SERVER}kvstore/icechunk/single_array.icechunk/`; + +test.for(["single_array", "hierarchy"])("golden test %s", async (name) => { + const icechunkUrl = `${TEST_DATA_SERVER}kvstore/icechunk/${name}.icechunk/|icechunk:`; + const fileUrl = `${TEST_DATA_SERVER}kvstore/icechunk/${name}/`; + const context = await sharedKvStoreContext(); + const fileKvStore = context.kvStoreContext.getKvStore(fileUrl); + const icechunkKvStore = context.kvStoreContext.getKvStore(icechunkUrl); + const fileKeys = await listKvStoreRecursively( + fileKvStore.store, + fileKvStore.path, + { responseKeys: "suffix" }, + ); + const icechunkKeys = await listKvStoreRecursively( + icechunkKvStore.store, + icechunkKvStore.path, + { responseKeys: "suffix" }, + ); + + // icechunk driver currently does not list chunk keys + expect(icechunkKeys.map(({ key }) => key)).toEqual( + fileKeys + .filter(({ key }) => key.endsWith("zarr.json")) + .map(({ key }) => key), + ); + + for (const { key } of fileKeys) { + const expectedResponse = ( + await readKvStore(fileKvStore.store, fileKvStore.path + key, { + throwIfMissing: true, + }) + ).response; + const actualResponse = ( + await readKvStore(icechunkKvStore.store, icechunkKvStore.path + key, { + throwIfMissing: true, + }) + ).response; + if (key.endsWith("zarr.json")) { + expect + .soft(await expectedResponse.json(), key) + .toEqual(await actualResponse.json()); + } else { + expect + .soft(await expectedResponse.arrayBuffer(), key) + .toEqual(await actualResponse.arrayBuffer()); + } + } +}); + +describe("ref access", () => { + test.for([ + "@branch.main/", + "@branch.other_branch/", + "@tag.tag1/", + "@tag.tag2/", + ])("version %s equivalent to no version", async (version) => { + const context = await sharedKvStoreContext(); + const { response: expectedResponse } = await context.kvStoreContext.read( + `${TEST_DATA_SERVER}kvstore/icechunk/single_array.icechunk/|icechunk:zarr.json`, + { throwIfMissing: true }, + ); + const { response } = await context.kvStoreContext.read( + `${TEST_DATA_SERVER}kvstore/icechunk/single_array.icechunk/|icechunk:${version}zarr.json`, + { throwIfMissing: true }, + ); + await expect(response.json()).resolves.toEqual( + await expectedResponse.json(), + ); + }); + + test("deleted tag fails", async () => { + const context = await sharedKvStoreContext(); + await expect( + context.kvStoreContext.read( + `${TEST_DATA_SERVER}kvstore/icechunk/single_array.icechunk/|icechunk:@tag.tag3/zarr.json`, + { throwIfMissing: true }, + ), + ).rejects.toMatchObject({ cause: new Error("Tag is marked as deleted") }); + }); +}); + +describe("completion", () => { + test("empty prefix", async () => { + const url = `${BASE_URL}|icechunk:`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Ref specifier", + "value": "@", + }, + { + "value": "zarr.json|", + }, + ], + "defaultCompletion": undefined, + "offset": 72, + } + `); + }); + + test("@ prefix", async () => { + const url = `${BASE_URL}|icechunk:@`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Branch", + "value": "branch.main/", + }, + { + "description": "Branch", + "value": "branch.other_branch/", + }, + { + "description": "Tag", + "value": "tag.tag1/", + }, + { + "description": "Tag", + "value": "tag.tag2/", + }, + { + "description": "Tag", + "value": "tag.tag3/", + }, + { + "description": "Snapshot", + "value": "FWWFQGAW742XMX0F5MF0/", + }, + { + "description": "Snapshot", + "value": "K85ER2WWGSGYGXW0GJC0/", + }, + ], + "offset": 73, + } + `); + }); + + test("@tag.t prefix", async () => { + const url = `${BASE_URL}|icechunk:@tag.t`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Tag", + "value": "tag.tag1/", + }, + { + "description": "Tag", + "value": "tag.tag2/", + }, + { + "description": "Tag", + "value": "tag.tag3/", + }, + ], + "offset": 73, + } + `); + }); + + test("@branch.m prefix", async () => { + const url = `${BASE_URL}|icechunk:@branch.m`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Branch", + "value": "branch.main/", + }, + ], + "offset": 73, + } + `); + }); +}); + +describe("virtual refs", () => { + const msw = mswFixture(); + const fakeS3Server = fakeS3ServerFixture({ msw }); + const s3Content = new Uint8Array(25); + for (let i = 0; i < 25; ++i) { + s3Content[i] = i; + } + beforeAll(async () => { + (await msw()).use(http.all(`${TEST_DATA_SERVER}*`, () => passthrough())); + const bucket = "mybucket"; + await createBucket(fakeS3Server, "mybucket"); + await writeObject(fakeS3Server, bucket, "myobject", s3Content); + }); + test("read virtual ref", async () => { + const context = await sharedKvStoreContext(); + const { response } = await context.kvStoreContext.read( + `${TEST_DATA_SERVER}kvstore/icechunk/virtual_ref.icechunk/|icechunk:c/0/0`, + { throwIfMissing: true }, + ); + expect(new Uint8Array(await response.arrayBuffer())).toEqual( + s3Content.slice(5, 25), + ); + }); +}); + +test("auto detect", async () => { + expect(await testAutoDetect(BASE_URL)).toMatchInlineSnapshot(` + [ + { + "description": "Icechunk repository", + "suffix": "icechunk:", + }, + ] + `); +}); + +describe("ref spec parsing", () => { + describe("valid round trip", () => { + test.for([ + "ZZZZZZZZZZZZZZZZZZZZ", + "branch.main", + "branch.other", + "tag.foo", + ])("%s", (version) => { + const parsed = parseRefSpec(version)!; + expect(formatRefSpec(parsed!)).toEqual(version); + }); + }); + + describe("invalid", () => { + test.for(["branch.", "b", "ZZZZZZZZZZZ"])("%s", (version) => { + expect(() => parseRefSpec(version)).toThrow(); + }); + }); +}); diff --git a/tests/kvstore/ngauth.browser_test.ts b/tests/kvstore/ngauth.browser_test.ts new file mode 100644 index 0000000000..152250e233 --- /dev/null +++ b/tests/kvstore/ngauth.browser_test.ts @@ -0,0 +1,142 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/ngauth/register.js"; +import "#src/kvstore/ngauth/register_credentials_provider.js"; +import { http, passthrough } from "msw"; +import { expect, test, afterEach } from "vitest"; +import { mswFixture } from "#tests/fixtures/msw"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; +import { statusMessageObserverFixture } from "#tests/fixtures/status_message_observer.js"; +import { clearCookies } from "#tests/util/clear_cookies.js"; +import { mswRequestLog } from "#tests/util/msw_request_log.js"; + +const msw = mswFixture(); + +const statusMessageObserver = statusMessageObserverFixture(); + +declare const FAKE_NGAUTH_SERVER: string; + +const BUCKET = "mybucket"; + +const sharedKvStoreContext = sharedKvStoreContextFixture(); +const sharedKvStoreContext2 = sharedKvStoreContextFixture(); +afterEach(() => { + clearCookies(); +}); + +test("login", async () => { + using requestLog = mswRequestLog(await msw(), { + redact: ["(?<=neuroglancer=)[a-f0-9]+"], + }); + (await msw()).use( + http.get( + `https://storage.googleapis.com/storage/v1/b/mybucket/o/missing`, + async () => { + return new Response(null, { status: 404 }); + }, + ), + http.all(`${FAKE_NGAUTH_SERVER}/*`, () => passthrough()), + ); + { + const readPromise = (await sharedKvStoreContext()).kvStoreContext.read( + `gs+ngauth+${FAKE_NGAUTH_SERVER}/${BUCKET}/missing`, + ); + console.log("Waiting for login"); + const loginButton = await ( + await statusMessageObserver() + ).waitForButton(/\blogin\b/); + console.log("Clicking login"); + loginButton.click(); + console.log("Waiting for read to complete"); + expect(await readPromise).toBe(undefined); + expect.soft(await requestLog.popAll()).toMatchInlineSnapshot(` + [ + { + "request": { + "url": "http://localhost:*/token", + }, + "response": { + "status": 401, + }, + }, + { + "request": { + "body": "{"token":"fake_token","bucket":"mybucket"}", + "url": "http://localhost:*/gcs_token", + }, + "response": { + "body": "{"token":"fake_gcs_token:mybucket"}", + "status": 200, + }, + }, + { + "request": { + "headers": [ + "authorization: Bearer fake_gcs_token:mybucket", + ], + "url": "https://storage.googleapis.com/storage/v1/b/mybucket/o/missing?alt=media&neuroglancer=*", + }, + "response": { + "status": 404, + }, + }, + ] + `); + } + + // Now that cookies has been set, login is not required. + { + const readPromise = (await sharedKvStoreContext2()).kvStoreContext.read( + `gs+ngauth+${FAKE_NGAUTH_SERVER}/${BUCKET}/missing`, + ); + expect(await readPromise).toBe(undefined); + expect(await requestLog.popAll()).toMatchInlineSnapshot(` + [ + { + "request": { + "url": "http://localhost:*/token", + }, + "response": { + "body": "fake_token", + "status": 200, + }, + }, + { + "request": { + "body": "{"token":"fake_token","bucket":"mybucket"}", + "url": "http://localhost:*/gcs_token", + }, + "response": { + "body": "{"token":"fake_gcs_token:mybucket"}", + "status": 200, + }, + }, + { + "request": { + "headers": [ + "authorization: Bearer fake_gcs_token:mybucket", + ], + "url": "https://storage.googleapis.com/storage/v1/b/mybucket/o/missing?alt=media&neuroglancer=*", + }, + "response": { + "status": 404, + }, + }, + ] + `); + } +}); diff --git a/tests/kvstore/ocdbt.spec.ts b/tests/kvstore/ocdbt.spec.ts new file mode 100644 index 0000000000..d99f4cdd81 --- /dev/null +++ b/tests/kvstore/ocdbt.spec.ts @@ -0,0 +1,1772 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import "#src/kvstore/ocdbt/register_frontend.js"; + +import { describe, expect, test } from "vitest"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import { + formatCommitTime, + formatVersion, + parseCommitTimePrefix, + parseVersion, +} from "#src/kvstore/ocdbt/version_specifier.js"; +import { + testKvStore, + sharedKvStoreContext, + testAutoDetect, +} from "#tests/kvstore/test_util.js"; + +declare const TEST_DATA_SERVER: string; + +const BASE_URL = `${TEST_DATA_SERVER}kvstore/ocdbt/files_min_arity.ocdbt/`; + +describe.for(["files_high_arity", "files_min_arity"])("%s", (name) => { + testKvStore( + async () => `${TEST_DATA_SERVER}kvstore/ocdbt/${name}.ocdbt/|ocdbt:`, + ); +}); + +describe("completion", () => { + test("empty prefix", async () => { + const url = `${BASE_URL}|ocdbt:`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Version specifier", + "value": "@", + }, + { + "value": "baz/", + }, + { + "value": "%23|", + }, + { + "value": "a|", + }, + { + "value": "b|", + }, + { + "value": "c|", + }, + { + "value": "empty|", + }, + ], + "defaultCompletion": undefined, + "offset": 66, + } + `); + }); + + test("single letter prefix", async () => { + const url = `${BASE_URL}|ocdbt:b`; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "b|", + }, + ], + "defaultCompletion": undefined, + "offset": 66, + } + `); + }); + + test("multi versions", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "Version specifier", + "value": "@", + }, + { + "value": "key1|", + }, + { + "value": "key10|", + }, + { + "value": "key100|", + }, + { + "value": "key101|", + }, + { + "value": "key102|", + }, + { + "value": "key103|", + }, + { + "value": "key104|", + }, + { + "value": "key105|", + }, + { + "value": "key106|", + }, + { + "value": "key107|", + }, + { + "value": "key108|", + }, + { + "value": "key109|", + }, + { + "value": "key11|", + }, + { + "value": "key110|", + }, + { + "value": "key111|", + }, + { + "value": "key112|", + }, + { + "value": "key113|", + }, + { + "value": "key114|", + }, + { + "value": "key115|", + }, + { + "value": "key116|", + }, + { + "value": "key117|", + }, + { + "value": "key118|", + }, + { + "value": "key119|", + }, + { + "value": "key12|", + }, + { + "value": "key120|", + }, + { + "value": "key121|", + }, + { + "value": "key122|", + }, + { + "value": "key123|", + }, + { + "value": "key124|", + }, + { + "value": "key125|", + }, + { + "value": "key126|", + }, + { + "value": "key127|", + }, + { + "value": "key128|", + }, + { + "value": "key129|", + }, + { + "value": "key13|", + }, + { + "value": "key130|", + }, + { + "value": "key131|", + }, + { + "value": "key132|", + }, + { + "value": "key133|", + }, + { + "value": "key134|", + }, + { + "value": "key135|", + }, + { + "value": "key136|", + }, + { + "value": "key137|", + }, + { + "value": "key138|", + }, + { + "value": "key139|", + }, + { + "value": "key14|", + }, + { + "value": "key140|", + }, + { + "value": "key141|", + }, + { + "value": "key142|", + }, + { + "value": "key143|", + }, + { + "value": "key144|", + }, + { + "value": "key145|", + }, + { + "value": "key146|", + }, + { + "value": "key147|", + }, + { + "value": "key148|", + }, + { + "value": "key149|", + }, + { + "value": "key15|", + }, + { + "value": "key150|", + }, + { + "value": "key151|", + }, + { + "value": "key152|", + }, + { + "value": "key153|", + }, + { + "value": "key154|", + }, + { + "value": "key155|", + }, + { + "value": "key156|", + }, + { + "value": "key157|", + }, + { + "value": "key158|", + }, + { + "value": "key159|", + }, + { + "value": "key16|", + }, + { + "value": "key160|", + }, + { + "value": "key161|", + }, + { + "value": "key162|", + }, + { + "value": "key163|", + }, + { + "value": "key164|", + }, + { + "value": "key165|", + }, + { + "value": "key166|", + }, + { + "value": "key167|", + }, + { + "value": "key168|", + }, + { + "value": "key169|", + }, + { + "value": "key17|", + }, + { + "value": "key170|", + }, + { + "value": "key171|", + }, + { + "value": "key172|", + }, + { + "value": "key173|", + }, + { + "value": "key174|", + }, + { + "value": "key175|", + }, + { + "value": "key176|", + }, + { + "value": "key177|", + }, + { + "value": "key178|", + }, + { + "value": "key179|", + }, + { + "value": "key18|", + }, + { + "value": "key180|", + }, + { + "value": "key181|", + }, + { + "value": "key182|", + }, + { + "value": "key183|", + }, + { + "value": "key184|", + }, + { + "value": "key185|", + }, + { + "value": "key186|", + }, + { + "value": "key187|", + }, + { + "value": "key188|", + }, + { + "value": "key189|", + }, + { + "value": "key19|", + }, + { + "value": "key190|", + }, + { + "value": "key191|", + }, + { + "value": "key192|", + }, + { + "value": "key193|", + }, + { + "value": "key194|", + }, + { + "value": "key195|", + }, + { + "value": "key196|", + }, + { + "value": "key197|", + }, + { + "value": "key198|", + }, + { + "value": "key199|", + }, + { + "value": "key2|", + }, + { + "value": "key20|", + }, + { + "value": "key200|", + }, + { + "value": "key21|", + }, + { + "value": "key22|", + }, + { + "value": "key23|", + }, + { + "value": "key24|", + }, + { + "value": "key25|", + }, + { + "value": "key26|", + }, + { + "value": "key27|", + }, + { + "value": "key28|", + }, + { + "value": "key29|", + }, + { + "value": "key3|", + }, + { + "value": "key30|", + }, + { + "value": "key31|", + }, + { + "value": "key32|", + }, + { + "value": "key33|", + }, + { + "value": "key34|", + }, + { + "value": "key35|", + }, + { + "value": "key36|", + }, + { + "value": "key37|", + }, + { + "value": "key38|", + }, + { + "value": "key39|", + }, + { + "value": "key4|", + }, + { + "value": "key40|", + }, + { + "value": "key41|", + }, + { + "value": "key42|", + }, + { + "value": "key43|", + }, + { + "value": "key44|", + }, + { + "value": "key45|", + }, + { + "value": "key46|", + }, + { + "value": "key47|", + }, + { + "value": "key48|", + }, + { + "value": "key49|", + }, + { + "value": "key5|", + }, + { + "value": "key50|", + }, + { + "value": "key51|", + }, + { + "value": "key52|", + }, + { + "value": "key53|", + }, + { + "value": "key54|", + }, + { + "value": "key55|", + }, + { + "value": "key56|", + }, + { + "value": "key57|", + }, + { + "value": "key58|", + }, + { + "value": "key59|", + }, + { + "value": "key6|", + }, + { + "value": "key60|", + }, + { + "value": "key61|", + }, + { + "value": "key62|", + }, + { + "value": "key63|", + }, + { + "value": "key64|", + }, + { + "value": "key65|", + }, + { + "value": "key66|", + }, + { + "value": "key67|", + }, + { + "value": "key68|", + }, + { + "value": "key69|", + }, + { + "value": "key7|", + }, + { + "value": "key70|", + }, + { + "value": "key71|", + }, + { + "value": "key72|", + }, + { + "value": "key73|", + }, + { + "value": "key74|", + }, + { + "value": "key75|", + }, + { + "value": "key76|", + }, + { + "value": "key77|", + }, + { + "value": "key78|", + }, + { + "value": "key79|", + }, + { + "value": "key8|", + }, + { + "value": "key80|", + }, + { + "value": "key81|", + }, + { + "value": "key82|", + }, + { + "value": "key83|", + }, + { + "value": "key84|", + }, + { + "value": "key85|", + }, + { + "value": "key86|", + }, + { + "value": "key87|", + }, + { + "value": "key88|", + }, + { + "value": "key89|", + }, + { + "value": "key9|", + }, + { + "value": "key90|", + }, + { + "value": "key91|", + }, + { + "value": "key92|", + }, + { + "value": "key93|", + }, + { + "value": "key94|", + }, + { + "value": "key95|", + }, + { + "value": "key96|", + }, + { + "value": "key97|", + }, + { + "value": "key98|", + }, + { + "value": "key99|", + }, + ], + "defaultCompletion": undefined, + "offset": 75, + } + `); + }); + + test("multi versions @", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:@`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "v200", + "value": "2025-01-30T21:32:59.915170266Z/", + }, + { + "description": "v199", + "value": "2025-01-30T21:32:59.907529813Z/", + }, + { + "description": "v198", + "value": "2025-01-30T21:32:59.899171472Z/", + }, + { + "description": "v197", + "value": "2025-01-30T21:32:59.890445567Z/", + }, + { + "description": "v196", + "value": "2025-01-30T21:32:59.882664734Z/", + }, + { + "description": "v195", + "value": "2025-01-30T21:32:59.874795394Z/", + }, + { + "description": "v194", + "value": "2025-01-30T21:32:59.867415745Z/", + }, + { + "description": "v193", + "value": "2025-01-30T21:32:59.859506131Z/", + }, + { + "description": "v192", + "value": "2025-01-30T21:32:59.85208681Z/", + }, + { + "description": "v191", + "value": "2025-01-30T21:32:59.844936515Z/", + }, + { + "description": "v190", + "value": "2025-01-30T21:32:59.838038049Z/", + }, + { + "description": "v189", + "value": "2025-01-30T21:32:59.831451435Z/", + }, + { + "description": "v188", + "value": "2025-01-30T21:32:59.82395756Z/", + }, + { + "description": "v187", + "value": "2025-01-30T21:32:59.817471451Z/", + }, + { + "description": "v186", + "value": "2025-01-30T21:32:59.810523502Z/", + }, + { + "description": "v185", + "value": "2025-01-30T21:32:59.803131173Z/", + }, + { + "description": "v184", + "value": "2025-01-30T21:32:59.795923259Z/", + }, + { + "description": "v183", + "value": "2025-01-30T21:32:59.789376083Z/", + }, + { + "description": "v182", + "value": "2025-01-30T21:32:59.782663414Z/", + }, + { + "description": "v181", + "value": "2025-01-30T21:32:59.775845803Z/", + }, + { + "description": "v180", + "value": "2025-01-30T21:32:59.768952184Z/", + }, + { + "description": "v179", + "value": "2025-01-30T21:32:59.761164455Z/", + }, + { + "description": "v178", + "value": "2025-01-30T21:32:59.753600253Z/", + }, + { + "description": "v177", + "value": "2025-01-30T21:32:59.744392584Z/", + }, + { + "description": "v176", + "value": "2025-01-30T21:32:59.732677264Z/", + }, + { + "description": "v175", + "value": "2025-01-30T21:32:59.723182335Z/", + }, + { + "description": "v174", + "value": "2025-01-30T21:32:59.713576643Z/", + }, + { + "description": "v173", + "value": "2025-01-30T21:32:59.703591276Z/", + }, + { + "description": "v172", + "value": "2025-01-30T21:32:59.694980469Z/", + }, + { + "description": "v171", + "value": "2025-01-30T21:32:59.684709254Z/", + }, + { + "description": "v170", + "value": "2025-01-30T21:32:59.674890773Z/", + }, + { + "description": "v169", + "value": "2025-01-30T21:32:59.666060381Z/", + }, + { + "description": "v168", + "value": "2025-01-30T21:32:59.657304213Z/", + }, + { + "description": "v167", + "value": "2025-01-30T21:32:59.647783686Z/", + }, + { + "description": "v166", + "value": "2025-01-30T21:32:59.638971354Z/", + }, + { + "description": "v165", + "value": "2025-01-30T21:32:59.629184204Z/", + }, + { + "description": "v164", + "value": "2025-01-30T21:32:59.619610441Z/", + }, + { + "description": "v163", + "value": "2025-01-30T21:32:59.610657854Z/", + }, + { + "description": "v162", + "value": "2025-01-30T21:32:59.601570489Z/", + }, + { + "description": "v161", + "value": "2025-01-30T21:32:59.591352112Z/", + }, + { + "description": "v160", + "value": "2025-01-30T21:32:59.581193356Z/", + }, + { + "description": "v159", + "value": "2025-01-30T21:32:59.571906863Z/", + }, + { + "description": "v158", + "value": "2025-01-30T21:32:59.562975436Z/", + }, + { + "description": "v157", + "value": "2025-01-30T21:32:59.551258602Z/", + }, + { + "description": "v156", + "value": "2025-01-30T21:32:59.542915508Z/", + }, + { + "description": "v155", + "value": "2025-01-30T21:32:59.534823333Z/", + }, + { + "description": "v154", + "value": "2025-01-30T21:32:59.526810295Z/", + }, + { + "description": "v153", + "value": "2025-01-30T21:32:59.519085767Z/", + }, + { + "description": "v152", + "value": "2025-01-30T21:32:59.510203627Z/", + }, + { + "description": "v151", + "value": "2025-01-30T21:32:59.499912772Z/", + }, + { + "description": "v50", + "value": "2025-01-30T21:32:58.741091391Z/", + }, + { + "description": "v49", + "value": "2025-01-30T21:32:58.733770038Z/", + }, + { + "description": "v48", + "value": "2025-01-30T21:32:58.725633688Z/", + }, + { + "description": "v47", + "value": "2025-01-30T21:32:58.717105275Z/", + }, + { + "description": "v46", + "value": "2025-01-30T21:32:58.70988888Z/", + }, + { + "description": "v45", + "value": "2025-01-30T21:32:58.702645896Z/", + }, + { + "description": "v44", + "value": "2025-01-30T21:32:58.695803699Z/", + }, + { + "description": "v43", + "value": "2025-01-30T21:32:58.687635677Z/", + }, + { + "description": "v42", + "value": "2025-01-30T21:32:58.680444765Z/", + }, + { + "description": "v41", + "value": "2025-01-30T21:32:58.672315573Z/", + }, + { + "description": "v40", + "value": "2025-01-30T21:32:58.663607924Z/", + }, + { + "description": "v39", + "value": "2025-01-30T21:32:58.655655309Z/", + }, + { + "description": "v38", + "value": "2025-01-30T21:32:58.649450448Z/", + }, + { + "description": "v37", + "value": "2025-01-30T21:32:58.642451615Z/", + }, + { + "description": "v36", + "value": "2025-01-30T21:32:58.636364693Z/", + }, + { + "description": "v35", + "value": "2025-01-30T21:32:58.629837282Z/", + }, + { + "description": "v34", + "value": "2025-01-30T21:32:58.623469189Z/", + }, + { + "description": "v33", + "value": "2025-01-30T21:32:58.616482142Z/", + }, + { + "description": "v32", + "value": "2025-01-30T21:32:58.609234678Z/", + }, + { + "description": "v31", + "value": "2025-01-30T21:32:58.602247321Z/", + }, + { + "description": "v30", + "value": "2025-01-30T21:32:58.595214183Z/", + }, + { + "description": "v29", + "value": "2025-01-30T21:32:58.588854668Z/", + }, + { + "description": "v28", + "value": "2025-01-30T21:32:58.58269864Z/", + }, + { + "description": "v27", + "value": "2025-01-30T21:32:58.575737362Z/", + }, + { + "description": "v26", + "value": "2025-01-30T21:32:58.56769563Z/", + }, + { + "description": "v25", + "value": "2025-01-30T21:32:58.560318856Z/", + }, + { + "description": "v24", + "value": "2025-01-30T21:32:58.552615533Z/", + }, + { + "description": "v23", + "value": "2025-01-30T21:32:58.544411524Z/", + }, + { + "description": "v22", + "value": "2025-01-30T21:32:58.536776612Z/", + }, + { + "description": "v21", + "value": "2025-01-30T21:32:58.528785227Z/", + }, + { + "description": "v20", + "value": "2025-01-30T21:32:58.520580028Z/", + }, + { + "description": "v19", + "value": "2025-01-30T21:32:58.513375995Z/", + }, + { + "description": "v18", + "value": "2025-01-30T21:32:58.507041805Z/", + }, + { + "description": "v17", + "value": "2025-01-30T21:32:58.499782226Z/", + }, + { + "description": "v16", + "value": "2025-01-30T21:32:58.492011647Z/", + }, + { + "description": "v15", + "value": "2025-01-30T21:32:58.484795694Z/", + }, + { + "description": "v14", + "value": "2025-01-30T21:32:58.478250025Z/", + }, + { + "description": "v13", + "value": "2025-01-30T21:32:58.471413106Z/", + }, + { + "description": "v12", + "value": "2025-01-30T21:32:58.465446537Z/", + }, + { + "description": "v11", + "value": "2025-01-30T21:32:58.458931396Z/", + }, + { + "description": "v10", + "value": "2025-01-30T21:32:58.451666122Z/", + }, + { + "description": "v9", + "value": "2025-01-30T21:32:58.443700437Z/", + }, + { + "description": "v8", + "value": "2025-01-30T21:32:58.4359968Z/", + }, + { + "description": "v7", + "value": "2025-01-30T21:32:58.426586311Z/", + }, + { + "description": "v6", + "value": "2025-01-30T21:32:58.41927557Z/", + }, + { + "description": "v5", + "value": "2025-01-30T21:32:58.411440602Z/", + }, + { + "description": "v4", + "value": "2025-01-30T21:32:58.403966834Z/", + }, + { + "description": "v3", + "value": "2025-01-30T21:32:58.395940026Z/", + }, + { + "description": "v2", + "value": "2025-01-30T21:32:58.387664952Z/", + }, + { + "description": "v1", + "value": "2025-01-30T21:32:58.378504069Z/", + }, + ], + "offset": 76, + } + `); + }); + + test("multi versions low arity @", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_low_arity.ocdbt/|ocdbt:@`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "v200", + "value": "2025-01-30T21:33:01.412908716Z/", + }, + { + "description": "v199", + "value": "2025-01-30T21:33:01.405073545Z/", + }, + { + "description": "v198", + "value": "2025-01-30T21:33:01.397185009Z/", + }, + { + "description": "v197", + "value": "2025-01-30T21:33:01.389666852Z/", + }, + { + "description": "v196", + "value": "2025-01-30T21:33:01.383055122Z/", + }, + { + "description": "v195", + "value": "2025-01-30T21:33:01.375776043Z/", + }, + { + "description": "v194", + "value": "2025-01-30T21:33:01.369169594Z/", + }, + { + "description": "v193", + "value": "2025-01-30T21:33:01.361236931Z/", + }, + { + "description": "v192", + "value": "2025-01-30T21:33:01.353050669Z/", + }, + { + "description": "v191", + "value": "2025-01-30T21:33:01.344525027Z/", + }, + { + "description": "v190", + "value": "2025-01-30T21:33:01.336971058Z/", + }, + { + "description": "v189", + "value": "2025-01-30T21:33:01.329331236Z/", + }, + { + "description": "v188", + "value": "2025-01-30T21:33:01.322173692Z/", + }, + { + "description": "v187", + "value": "2025-01-30T21:33:01.314665901Z/", + }, + { + "description": "v186", + "value": "2025-01-30T21:33:01.305194002Z/", + }, + { + "description": "v185", + "value": "2025-01-30T21:33:01.296328302Z/", + }, + { + "description": "v184", + "value": "2025-01-30T21:33:01.2884889Z/", + }, + { + "description": "v183", + "value": "2025-01-30T21:33:01.279548533Z/", + }, + { + "description": "v182", + "value": "2025-01-30T21:33:01.272841026Z/", + }, + { + "description": "v181", + "value": "2025-01-30T21:33:01.265876205Z/", + }, + { + "description": "v180", + "value": "2025-01-30T21:33:01.258486834Z/", + }, + { + "description": "v179", + "value": "2025-01-30T21:33:01.249556168Z/", + }, + { + "description": "v178", + "value": "2025-01-30T21:33:01.241978649Z/", + }, + { + "description": "v177", + "value": "2025-01-30T21:33:01.233743108Z/", + }, + { + "description": "v176", + "value": "2025-01-30T21:33:01.226683489Z/", + }, + { + "description": "v175", + "value": "2025-01-30T21:33:01.218208673Z/", + }, + { + "description": "v174", + "value": "2025-01-30T21:33:01.211324534Z/", + }, + { + "description": "v173", + "value": "2025-01-30T21:33:01.204150737Z/", + }, + { + "description": "v172", + "value": "2025-01-30T21:33:01.196846366Z/", + }, + { + "description": "v171", + "value": "2025-01-30T21:33:01.189114838Z/", + }, + { + "description": "v170", + "value": "2025-01-30T21:33:01.182343292Z/", + }, + { + "description": "v169", + "value": "2025-01-30T21:33:01.175344873Z/", + }, + { + "description": "v168", + "value": "2025-01-30T21:33:01.167323742Z/", + }, + { + "description": "v167", + "value": "2025-01-30T21:33:01.158600914Z/", + }, + { + "description": "v166", + "value": "2025-01-30T21:33:01.151039247Z/", + }, + { + "description": "v165", + "value": "2025-01-30T21:33:01.142758201Z/", + }, + { + "description": "v164", + "value": "2025-01-30T21:33:01.134050239Z/", + }, + { + "description": "v163", + "value": "2025-01-30T21:33:01.12352153Z/", + }, + { + "description": "v162", + "value": "2025-01-30T21:33:01.114900939Z/", + }, + { + "description": "v161", + "value": "2025-01-30T21:33:01.106381236Z/", + }, + { + "description": "v160", + "value": "2025-01-30T21:33:01.097567209Z/", + }, + { + "description": "v159", + "value": "2025-01-30T21:33:01.088362502Z/", + }, + { + "description": "v158", + "value": "2025-01-30T21:33:01.07953878Z/", + }, + { + "description": "v157", + "value": "2025-01-30T21:33:01.07118037Z/", + }, + { + "description": "v156", + "value": "2025-01-30T21:33:01.062647525Z/", + }, + { + "description": "v155", + "value": "2025-01-30T21:33:01.05270771Z/", + }, + { + "description": "v154", + "value": "2025-01-30T21:33:01.044510219Z/", + }, + { + "description": "v153", + "value": "2025-01-30T21:33:01.035482287Z/", + }, + { + "description": "v152", + "value": "2025-01-30T21:33:01.027134931Z/", + }, + { + "description": "v151", + "value": "2025-01-30T21:33:01.018348224Z/", + }, + { + "description": "v50", + "value": "2025-01-30T21:33:00.255661377Z/", + }, + { + "description": "v49", + "value": "2025-01-30T21:33:00.249546282Z/", + }, + { + "description": "v48", + "value": "2025-01-30T21:33:00.24324847Z/", + }, + { + "description": "v47", + "value": "2025-01-30T21:33:00.235482656Z/", + }, + { + "description": "v46", + "value": "2025-01-30T21:33:00.229685581Z/", + }, + { + "description": "v45", + "value": "2025-01-30T21:33:00.222619375Z/", + }, + { + "description": "v44", + "value": "2025-01-30T21:33:00.216499339Z/", + }, + { + "description": "v43", + "value": "2025-01-30T21:33:00.209718403Z/", + }, + { + "description": "v42", + "value": "2025-01-30T21:33:00.203031256Z/", + }, + { + "description": "v41", + "value": "2025-01-30T21:33:00.196992209Z/", + }, + { + "description": "v40", + "value": "2025-01-30T21:33:00.190615007Z/", + }, + { + "description": "v39", + "value": "2025-01-30T21:33:00.184409287Z/", + }, + { + "description": "v38", + "value": "2025-01-30T21:33:00.177686632Z/", + }, + { + "description": "v37", + "value": "2025-01-30T21:33:00.170663164Z/", + }, + { + "description": "v36", + "value": "2025-01-30T21:33:00.164254955Z/", + }, + { + "description": "v35", + "value": "2025-01-30T21:33:00.157221696Z/", + }, + { + "description": "v34", + "value": "2025-01-30T21:33:00.150683623Z/", + }, + { + "description": "v33", + "value": "2025-01-30T21:33:00.144124101Z/", + }, + { + "description": "v32", + "value": "2025-01-30T21:33:00.136828804Z/", + }, + { + "description": "v31", + "value": "2025-01-30T21:33:00.130206738Z/", + }, + { + "description": "v30", + "value": "2025-01-30T21:33:00.123729003Z/", + }, + { + "description": "v29", + "value": "2025-01-30T21:33:00.118311054Z/", + }, + { + "description": "v28", + "value": "2025-01-30T21:33:00.111646289Z/", + }, + { + "description": "v27", + "value": "2025-01-30T21:33:00.104021875Z/", + }, + { + "description": "v26", + "value": "2025-01-30T21:33:00.098323976Z/", + }, + { + "description": "v25", + "value": "2025-01-30T21:33:00.091713725Z/", + }, + { + "description": "v24", + "value": "2025-01-30T21:33:00.085808147Z/", + }, + { + "description": "v23", + "value": "2025-01-30T21:33:00.079917954Z/", + }, + { + "description": "v22", + "value": "2025-01-30T21:33:00.07399539Z/", + }, + { + "description": "v21", + "value": "2025-01-30T21:33:00.067625089Z/", + }, + { + "description": "v20", + "value": "2025-01-30T21:33:00.061424053Z/", + }, + { + "description": "v19", + "value": "2025-01-30T21:33:00.054913429Z/", + }, + { + "description": "v18", + "value": "2025-01-30T21:33:00.049050718Z/", + }, + { + "description": "v17", + "value": "2025-01-30T21:33:00.043422024Z/", + }, + { + "description": "v16", + "value": "2025-01-30T21:33:00.038075507Z/", + }, + { + "description": "v15", + "value": "2025-01-30T21:33:00.032736666Z/", + }, + { + "description": "v14", + "value": "2025-01-30T21:33:00.027587276Z/", + }, + { + "description": "v13", + "value": "2025-01-30T21:33:00.022069483Z/", + }, + { + "description": "v12", + "value": "2025-01-30T21:33:00.016382316Z/", + }, + { + "description": "v11", + "value": "2025-01-30T21:33:00.00993712Z/", + }, + { + "description": "v10", + "value": "2025-01-30T21:33:00.003133934Z/", + }, + { + "description": "v9", + "value": "2025-01-30T21:32:59.996682626Z/", + }, + { + "description": "v8", + "value": "2025-01-30T21:32:59.990615099Z/", + }, + { + "description": "v7", + "value": "2025-01-30T21:32:59.983298304Z/", + }, + { + "description": "v6", + "value": "2025-01-30T21:32:59.976923153Z/", + }, + { + "description": "v5", + "value": "2025-01-30T21:32:59.968640783Z/", + }, + { + "description": "v4", + "value": "2025-01-30T21:32:59.961757956Z/", + }, + { + "description": "v3", + "value": "2025-01-30T21:32:59.95332112Z/", + }, + { + "description": "v2", + "value": "2025-01-30T21:32:59.945945456Z/", + }, + { + "description": "v1", + "value": "2025-01-30T21:32:59.931662761Z/", + }, + ], + "offset": 75, + } + `); + }); + + test("multi versions @v", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:@v`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "description": "2025-01-30T21:32:59.915170266Z", + "value": "v200/", + }, + { + "description": "2025-01-30T21:32:59.907529813Z", + "value": "v199/", + }, + { + "description": "2025-01-30T21:32:59.899171472Z", + "value": "v198/", + }, + { + "description": "2025-01-30T21:32:59.890445567Z", + "value": "v197/", + }, + { + "description": "2025-01-30T21:32:59.882664734Z", + "value": "v196/", + }, + { + "description": "2025-01-30T21:32:59.874795394Z", + "value": "v195/", + }, + { + "description": "2025-01-30T21:32:59.867415745Z", + "value": "v194/", + }, + { + "description": "2025-01-30T21:32:59.859506131Z", + "value": "v193/", + }, + ], + "offset": 76, + } + `); + }); + + test("multi versions @v1", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:@v1`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "v1/", + }, + ], + "offset": 76, + } + `); + }); + + test("multi versions @v1/", async () => { + expect( + await getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:@v1/`, + }), + ).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "key1|", + }, + ], + "defaultCompletion": undefined, + "offset": 79, + } + `); + }); + + test("multi versions @xxx/", async () => { + await expect( + getKvStoreCompletions(await sharedKvStoreContext(), { + url: `${TEST_DATA_SERVER}kvstore/ocdbt/multi_version_high_arity.ocdbt/|ocdbt:@xxx/`, + }), + ).rejects.toThrowErrorMatchingInlineSnapshot( + `[Error: Invalid OCDBT version specifier: "xxx"]`, + ); + }); +}); + +test("auto detect", async () => { + expect(await testAutoDetect(BASE_URL)).toMatchInlineSnapshot(` + [ + { + "description": "OCDBT database", + "suffix": "ocdbt:", + }, + ] + `); +}); + +describe("version specifier parsing", () => { + describe("valid round trip", () => { + test.for([ + "v1", + "v2", + "v18446744073709551615", + "2025-01-01T01:23:45Z", + "2025-01-01T01:23:45.5Z", + "2025-01-28T18:11:06.511694032Z", + ])("%s", (version) => { + const parsed = parseVersion(version); + expect(formatVersion(parsed)).toEqual(version); + }); + }); + + describe("valid non-round-trip", () => { + test.for([["2025-01-01T01:23:45.Z", "2025-01-01T01:23:45Z"]])( + "%s -> %s", + ([a, b]) => { + const parsed = parseVersion(a); + const parsed2 = parseVersion(b); + expect(parsed).toEqual(parsed2); + expect(formatVersion(parsed)).toEqual(b); + }, + ); + }); + + describe("invalid", () => { + test.for(["v0", "", "v", "v18446744073709551616", "2025-01-01T01:23:4Z"])( + "%s", + (version) => { + expect(() => parseVersion(version)).toThrow(); + }, + ); + }); +}); + +describe("commit time prefix", () => { + describe("valid prefix", () => { + test.for([ + ["", "0000-01-01T00:00:00Z", "9999-12-31T23:59:59.999999999Z"], + ["1", "1000-01-01T00:00:00Z", "1999-12-31T23:59:59.999999999Z"], + ["1000", "1000-01-01T00:00:00Z", "1000-12-31T23:59:59.999999999Z"], + ["1000-", "1000-01-01T00:00:00Z", "1000-12-31T23:59:59.999999999Z"], + ["1000-0", "1000-01-01T00:00:00Z", "1000-09-30T23:59:59.999999999Z"], + ["1000-1", "1000-10-01T00:00:00Z", "1000-12-31T23:59:59.999999999Z"], + ["1000-10", "1000-10-01T00:00:00Z", "1000-10-31T23:59:59.999999999Z"], + ["1000-02", "1000-02-01T00:00:00Z", "1000-02-28T23:59:59.999999999Z"], + ["1000-02-0", "1000-02-01T00:00:00Z", "1000-02-09T23:59:59.999999999Z"], + ["1000-02-1", "1000-02-10T00:00:00Z", "1000-02-19T23:59:59.999999999Z"], + ["1000-02-2", "1000-02-20T00:00:00Z", "1000-02-28T23:59:59.999999999Z"], + ["1000-02-20", "1000-02-20T00:00:00Z", "1000-02-20T23:59:59.999999999Z"], + [ + "1000-02-20T1", + "1000-02-20T10:00:00Z", + "1000-02-20T19:59:59.999999999Z", + ], + [ + "1000-02-20T2", + "1000-02-20T20:00:00Z", + "1000-02-20T23:59:59.999999999Z", + ], + [ + "1000-02-20T20:", + "1000-02-20T20:00:00Z", + "1000-02-20T20:59:59.999999999Z", + ], + [ + "1000-02-20T20:4", + "1000-02-20T20:40:00Z", + "1000-02-20T20:49:59.999999999Z", + ], + [ + "1000-02-20T20:45", + "1000-02-20T20:45:00Z", + "1000-02-20T20:45:59.999999999Z", + ], + [ + "1000-02-20T20:45:01", + "1000-02-20T20:45:01Z", + "1000-02-20T20:45:01.999999999Z", + ], + [ + "1000-02-20T20:45:01.3", + "1000-02-20T20:45:01.3Z", + "1000-02-20T20:45:01.399999999Z", + ], + [ + "1000-02-20T20:45:01.388", + "1000-02-20T20:45:01.388Z", + "1000-02-20T20:45:01.388999999Z", + ], + [ + "1000-02-20T20:45:01.9999999999", + "1000-02-20T20:45:01.999999999Z", + "1000-02-20T20:45:01.999999999Z", + ], + ])('"%s" -> [%s, %s]', ([prefix, expectedMin, expectedMax]) => { + const [min, max] = parseCommitTimePrefix(prefix); + expect.soft(formatCommitTime(min)).toEqual(expectedMin); + expect.soft(formatCommitTime(max)).toEqual(expectedMax); + }); + }); + + describe("invalid prefix", () => { + test.for([ + ["99999", /Expected prefix of .*/], + ["1000-3", "Invalid month prefix: 3"], + ["1000-02-3", "Invalid day prefix: 3"], + ] as const)("%s", ([prefix, error]) => { + expect(() => parseCommitTimePrefix(prefix)).toThrowError(error); + }); + }); +}); diff --git a/tests/kvstore/s3.spec.ts b/tests/kvstore/s3.spec.ts new file mode 100644 index 0000000000..eeb1fd3690 --- /dev/null +++ b/tests/kvstore/s3.spec.ts @@ -0,0 +1,110 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/s3/register_frontend.js"; +import "#src/kvstore/http/register_frontend.js"; +import { beforeAll, describe, expect, test } from "vitest"; +import { + createBucket, + fakeS3ServerFixture, + writeObject, +} from "#tests/fixtures/fake_s3_server.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { mswFixture } from "#tests/fixtures/msw"; +import { getTestFiles } from "#tests/kvstore/test_data.js"; +import { testKvStore, sharedKvStoreContext } from "#tests/kvstore/test_util.js"; + +const msw = mswFixture(); +const fakeS3Server = fakeS3ServerFixture({ msw }); + +const BUCKET = "mybucket"; +const OTHER_BUCKET = "otherbucket"; + +const SPECIAL_CHAR_CODES: number[] = []; +for (let i = 1; i <= 9; ++i) { + SPECIAL_CHAR_CODES.push(i); +} + +beforeAll(async () => { + // Add data to S3. + await createBucket(fakeS3Server, BUCKET); + for (const [relativePath, content] of await getTestFiles()) { + await writeObject( + fakeS3Server, + BUCKET, + relativePath, + new Uint8Array(content), + ); + } + + // Create another bucket for testing special character handling in list + // operations. + await createBucket(fakeS3Server, OTHER_BUCKET); + for (const charCode of SPECIAL_CHAR_CODES) { + await writeObject( + fakeS3Server, + OTHER_BUCKET, + String.fromCharCode(charCode), + Uint8Array.of(charCode), + ); + } +}); + +describe("s3://", () => { + testKvStore(constantFixture(`s3://${BUCKET}/`)); +}); + +describe("s3+http:// virtual-hosted style URL", () => { + testKvStore(constantFixture(`s3+https://${BUCKET}.s3.amazonaws.com/`)); +}); + +describe("s3+http:// path-style URL", () => { + testKvStore(constantFixture(`s3+https://s3.amazonaws.com/${BUCKET}/`)); +}); + +describe("http:// virtual hosted-style URL", () => { + testKvStore(constantFixture(`https://${BUCKET}.s3.amazonaws.com/`)); +}); + +describe("http:// path-style URL", () => { + testKvStore(constantFixture(`https://s3.amazonaws.com/${BUCKET}/`)); +}); + +describe("special characters", () => { + test.for(SPECIAL_CHAR_CODES)("charCode=%s", async (charCode) => { + const context = await sharedKvStoreContext(); + const response = await context.kvStoreContext.read( + `s3://${OTHER_BUCKET}/${encodeURIComponent(String.fromCharCode(charCode))}`, + { throwIfMissing: true }, + ); + expect(await response.response.arrayBuffer()).toEqual( + Uint8Array.of(charCode).buffer, + ); + }); + test("list", async () => { + const context = await sharedKvStoreContext(); + const response = await context.kvStoreContext.list( + `s3://${OTHER_BUCKET}/`, + { responseKeys: "path" }, + ); + expect(response).toEqual({ + directories: [], + entries: SPECIAL_CHAR_CODES.map((charCode) => ({ + key: String.fromCharCode(charCode), + })), + }); + }); +}); diff --git a/tests/kvstore/test_data.ts b/tests/kvstore/test_data.ts new file mode 100644 index 0000000000..89f87f30e7 --- /dev/null +++ b/tests/kvstore/test_data.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import fs from "node:fs/promises"; +import path from "node:path"; + +export const TEST_DATA_DIR = path.join( + import.meta.dirname, + "..", + "..", + "testdata", + "kvstore", +); +export const TEST_FILES_DIR = path.join(TEST_DATA_DIR, "files"); + +export async function findFilesRecursively(rootDir: string): Promise { + const relativePaths: string[] = []; + for (const entry of await fs.readdir(rootDir, { + recursive: true, + withFileTypes: true, + })) { + if (!entry.isFile()) { + continue; + } + const fullPath = path.join(entry.parentPath, entry.name); + const relativePath = path + .relative(rootDir, fullPath) + .replaceAll(path.sep, "/"); + relativePaths.push(relativePath); + } + return relativePaths; +} + +export async function getTestFiles( + rootDir: string = TEST_FILES_DIR, +): Promise> { + const map = new Map(); + for (const relativePath of await findFilesRecursively(rootDir)) { + const content = await fs.readFile(path.join(rootDir, relativePath)); + map.set(relativePath, content); + } + return map; +} diff --git a/tests/kvstore/test_util.ts b/tests/kvstore/test_util.ts new file mode 100644 index 0000000000..8ace41c556 --- /dev/null +++ b/tests/kvstore/test_util.ts @@ -0,0 +1,227 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect, test } from "vitest"; +import type { AutoDetectMatch } from "#src/kvstore/auto_detect.js"; +import { autoDetectFormat } from "#src/kvstore/auto_detect.js"; +import type { KvStore } from "#src/kvstore/index.js"; +import { listKvStoreRecursively, readKvStore } from "#src/kvstore/index.js"; +import type { Fixture } from "#tests/fixtures/fixture.js"; +import { sharedKvStoreContextFixture } from "#tests/fixtures/shared_kvstore_context.js"; + +export const sharedKvStoreContext = sharedKvStoreContextFixture(); + +export function testRead(url: Fixture) { + test("read not found", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}missing`), + ).toBe(undefined); + }); + test("read full", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { throwIfMissing: true }); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(0); + expect.soft(response!.length).toEqual(3); + expect.soft(await response!.response.text()).toEqual("abc"); + }); + test("read byte range zero length", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { offset: 1, length: 0 }, + throwIfMissing: true, + }); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(1); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("read byte range zero length empty file", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}empty`, { + byteRange: { offset: 0, length: 0 }, + throwIfMissing: true, + }); + expect.soft(response!.totalSize).toEqual(0); + expect.soft(response!.offset).toEqual(0); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("read byte range offset+length", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { offset: 1, length: 1 }, + throwIfMissing: true, + }); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(1); + expect.soft(response!.length).toEqual(1); + expect.soft(await response!.response.text()).toEqual("b"); + }); + test("read byte range suffixLength", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { suffixLength: 1 }, + throwIfMissing: true, + }); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(2); + expect.soft(response!.length).toEqual(1); + expect.soft(await response!.response.text()).toEqual("c"); + }); + test("read byte range suffixLength=0", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}a`, { + byteRange: { suffixLength: 0 }, + throwIfMissing: true, + }); + expect.soft(response!.totalSize).toEqual(3); + expect.soft(response!.offset).toEqual(3); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); + test("stat on directory returns not found", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.stat(`${await url()}baz`); + expect(response).toEqual(undefined); + }); + test("read on directory returns not found", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}baz`); + expect(response).toEqual(undefined); + }); + + test("read #", async () => { + const response = await ( + await sharedKvStoreContext() + ).kvStoreContext.read(`${await url()}%23`, { throwIfMissing: true }); + expect.soft(response!.totalSize).toEqual(0); + expect.soft(response!.offset).toEqual(0); + expect.soft(response!.length).toEqual(0); + expect.soft(await response!.response.text()).toEqual(""); + }); +} + +export function testList(url: Fixture) { + test("list with empty prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(await url(), { + responseKeys: "suffix", + }), + ).toEqual({ + directories: ["baz"], + entries: [ + { + key: "#", + }, + { + key: "a", + }, + { + key: "b", + }, + { + key: "c", + }, + { + key: "empty", + }, + ], + }); + }); + + test("list with file prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(`${await url()}e`, { + responseKeys: "suffix", + }), + ).toEqual({ + directories: [], + entries: [ + { + key: "mpty", + }, + ], + }); + }); + + test("list with directory prefix", async () => { + expect( + await ( + await sharedKvStoreContext() + ).kvStoreContext.list(`${await url()}baz/`, { + responseKeys: "suffix", + }), + ).toEqual({ + directories: [], + entries: [ + { key: "first" }, + { + key: "x", + }, + { key: "z" }, + ], + }); + }); +} + +export function testKvStore(url: Fixture) { + testRead(url); + testList(url); +} + +export async function readAllFromKvStore( + kvStore: KvStore, + prefix: string, +): Promise> { + const keys = await listKvStoreRecursively(kvStore, prefix, { + responseKeys: "suffix", + }); + const values = await Promise.all( + keys.map(async ({ key }) => { + const readResponse = await readKvStore(kvStore, prefix + key, { + throwIfMissing: true, + }); + return Buffer.from(await readResponse.response.arrayBuffer()); + }), + ); + return new Map(Array.from(keys, ({ key }, i) => [key, values[i]])); +} + +export async function testAutoDetect(url: string): Promise { + const kvStoreContext = (await sharedKvStoreContext()).kvStoreContext; + const result = await autoDetectFormat({ + url, + kvStoreContext, + autoDetectDirectory: () => kvStoreContext.autoDetectRegistry.directorySpec, + autoDetectFile: () => kvStoreContext.autoDetectRegistry.fileSpec, + }); + return result.matches; +} diff --git a/tests/kvstore/url.spec.ts b/tests/kvstore/url.spec.ts new file mode 100644 index 0000000000..1c4ad25fe8 --- /dev/null +++ b/tests/kvstore/url.spec.ts @@ -0,0 +1,205 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { describe, expect, test } from "vitest"; +import { + finalPipelineUrlComponent, + kvstoreEnsureDirectoryPipelineUrl, + parsePipelineUrlComponent, + parseUrlSuffix, + pipelineUrlJoin, + resolveRelativePath, +} from "#src/kvstore/url.js"; + +describe("kvstoreEnsureDirectoryPipelineUrl", () => { + test("single pipeline component", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo")).toEqual( + "http://foo/", + ); + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo/")).toEqual( + "http://foo/", + ); + }); + + test("with query parameters", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo?a=b")).toEqual( + "http://foo/?a=b", + ); + }); + + test("with fragment parameters", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo#a=b")).toEqual( + "http://foo/#a=b", + ); + }); + + test("multiple pipeline component", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo|zarr")).toEqual( + "http://foo|zarr:", + ); + expect(kvstoreEnsureDirectoryPipelineUrl("http://foo|zarr:")).toEqual( + "http://foo|zarr:", + ); + }); + + test("s3", () => { + expect(kvstoreEnsureDirectoryPipelineUrl("s3://bucket/path")).toEqual( + "s3://bucket/path/", + ); + }); +}); + +describe("pipelineUrlJoin", () => { + test("simple", () => { + expect(pipelineUrlJoin("gs://foo", "a", "b")).toEqual("gs://foo/a/b"); + }); + test("query parameter", () => { + expect(pipelineUrlJoin("gs://foo?a=b", "a", "b")).toEqual( + "gs://foo/a/b?a=b", + ); + expect(pipelineUrlJoin("gs://foo?a=b|zarr", "a", "b")).toEqual( + "gs://foo?a=b|zarr:a/b", + ); + }); +}); + +describe("finalPipelineUrlComponent", () => { + test("single component", () => { + expect(finalPipelineUrlComponent("")).toEqual(""); + expect(finalPipelineUrlComponent("gs://a")).toEqual("gs://a"); + }); + test("multiple components", () => { + expect(finalPipelineUrlComponent("gs://a|zarr")).toEqual("zarr"); + expect(finalPipelineUrlComponent("gs://a|zip:foo|zarr:")).toEqual("zarr:"); + }); +}); + +describe("parsePipelineUrlComponent", () => { + test("scheme only", () => { + expect(parsePipelineUrlComponent("zarr")).toEqual({ + scheme: "zarr", + suffix: undefined, + url: "zarr", + }); + }); + test("empty suffix", () => { + expect(parsePipelineUrlComponent("zarr:")).toEqual({ + scheme: "zarr", + suffix: "", + url: "zarr:", + }); + }); +}); + +describe("parseUrlSuffix", () => { + test("no suffix", () => { + expect(parseUrlSuffix(undefined)).toMatchInlineSnapshot(` + { + "authorityAndPath": undefined, + "fragment": undefined, + "query": undefined, + } + `); + }); + test("empty suffix", () => { + expect(parseUrlSuffix("")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": undefined, + "query": undefined, + } + `); + }); + test("path only", () => { + expect(parseUrlSuffix("a/b/")).toMatchInlineSnapshot(` + { + "authorityAndPath": "a/b/", + "fragment": undefined, + "query": undefined, + } + `); + }); + test("query only", () => { + expect(parseUrlSuffix("?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": undefined, + "query": "query", + } + `); + }); + test("fragment only", () => { + expect(parseUrlSuffix("#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "", + "fragment": "fragment", + "query": undefined, + } + `); + }); + test("path and query", () => { + expect(parseUrlSuffix("//host/path?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": undefined, + "query": "query", + } + `); + }); + test("path and fragment", () => { + expect(parseUrlSuffix("//host/path#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment", + "query": undefined, + } + `); + }); + test("path and query and fragment", () => { + expect(parseUrlSuffix("//host/path?query#fragment")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment", + "query": "query", + } + `); + }); + test("path and fragment with fake query", () => { + expect(parseUrlSuffix("//host/path#fragment?query")).toMatchInlineSnapshot(` + { + "authorityAndPath": "//host/path", + "fragment": "fragment?query", + "query": undefined, + } + `); + }); +}); + +describe("resolveRelativePath", () => { + test("empty base", () => { + expect(resolveRelativePath("", "a")).toEqual("a"); + expect(resolveRelativePath("", "a/")).toEqual("a/"); + expect(resolveRelativePath("", "")).toEqual(""); + expect(() => resolveRelativePath("", "..")).toThrowError( + /Invalid relative path/, + ); + }); + + test("non empty base", () => { + expect(resolveRelativePath("base/b", "../c")).toEqual("base/c"); + expect(resolveRelativePath("base/b", "../c/")).toEqual("base/c/"); + }); +}); diff --git a/tests/kvstore/zip.spec.ts b/tests/kvstore/zip.spec.ts new file mode 100644 index 0000000000..d8c58fab17 --- /dev/null +++ b/tests/kvstore/zip.spec.ts @@ -0,0 +1,178 @@ +/** + * @license + * Copyright 2025 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import "#src/kvstore/http/register_frontend.js"; +import "#src/kvstore/zip/register_frontend.js"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { describe, expect, test } from "vitest"; +import yauzl from "yauzl"; +import { getKvStoreCompletions } from "#src/datasource/kvstore_completions.js"; +import { constantFixture } from "#tests/fixtures/fixture.js"; +import { httpServerFixture } from "#tests/fixtures/http_server.js"; +import { TEST_DATA_DIR } from "#tests/kvstore/test_data.js"; +import { + testKvStore, + sharedKvStoreContext, + readAllFromKvStore, +} from "#tests/kvstore/test_util.js"; + +const serverFixture = httpServerFixture(constantFixture(TEST_DATA_DIR)); + +function readAllUsingYauzl(zipPath: string) { + return new Promise((resolve, reject) => { + const map = new Map(); + yauzl.open(zipPath, { lazyEntries: true }, function (err, zipfile) { + if (err) { + reject(err); + return; + } + zipfile.on("entry", async (entry) => { + if (entry.fileName.endsWith("/")) { + zipfile.readEntry(); + return; + } + zipfile.openReadStream(entry, async (err, readStream) => { + if (err) { + reject(err); + return; + } + const parts: Buffer[] = []; + readStream.on("data", (chunk) => { + parts.push(chunk); + }); + readStream.on("end", () => { + map.set(entry.fileName, Buffer.concat(parts)); + zipfile.readEntry(); + }); + }); + }); + zipfile.on("end", () => { + zipfile.close(); + resolve(map); + }); + zipfile.readEntry(); + }); + }); +} + +describe("yauzl success cases", async () => { + const relativePath = "zip/from-yauzl/success"; + const zipFiles = await fs.readdir(path.join(TEST_DATA_DIR, relativePath)); + test.for(zipFiles)("%s", async (zipFile) => { + const url = + (await serverFixture.serverUrl()) + `${relativePath}/${zipFile}|zip:`; + const { kvStoreContext } = await sharedKvStoreContext(); + const kvStore = kvStoreContext.getKvStore(url); + const contentFromZip = await readAllFromKvStore( + kvStore.store, + kvStore.path, + ); + const expectedFiles = await readAllUsingYauzl( + path.join(TEST_DATA_DIR, relativePath, zipFile), + ); + expect(contentFromZip).toEqual(expectedFiles); + }); +}); + +describe("yauzl failure cases", async () => { + const relativePath = "zip/from-yauzl/failure"; + const zipFiles = await fs.readdir(path.join(TEST_DATA_DIR, relativePath)); + test.for(zipFiles)("%s", async (zipFile) => { + const url = + (await serverFixture.serverUrl()) + `${relativePath}/${zipFile}|zip:`; + const { kvStoreContext } = await sharedKvStoreContext(); + const kvStore = kvStoreContext.getKvStore(url); + const expectedError = new RegExp( + zipFile + .replace(/(_[0-9]+)?\.zip$/, "") + .split(/\s+/) + .join(".*"), + "i", + ); + await expect( + readAllFromKvStore(kvStore.store, kvStore.path).then(() => null), + ).rejects.toThrowError(expectedError); + }); +}); + +describe("kvstore operations", () => { + testKvStore( + async () => (await serverFixture.serverUrl()) + "zip/files.zip|zip:", + ); +}); + +describe("completion", () => { + test("empty prefix", async () => { + const url = (await serverFixture.serverUrl()) + "zip/files.zip|zip:"; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "%23|", + }, + { + "value": "a|", + }, + { + "value": "b|", + }, + { + "value": "c|", + }, + { + "value": "empty|", + }, + ], + "defaultCompletion": undefined, + "offset": 41, + } + `); + }); + + test("single letter prefix", async () => { + const url = (await serverFixture.serverUrl()) + "zip/files.zip|zip:b"; + const completions = await getKvStoreCompletions( + await sharedKvStoreContext(), + { + url, + }, + ); + expect(completions).toMatchInlineSnapshot(` + { + "completions": [ + { + "value": "baz/", + }, + { + "value": "b|", + }, + ], + "defaultCompletion": undefined, + "offset": 41, + } + `); + }); +}); diff --git a/tests/util/clear_cookies.ts b/tests/util/clear_cookies.ts new file mode 100644 index 0000000000..54ab46b3dd --- /dev/null +++ b/tests/util/clear_cookies.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Clears all cookies that are accessible to JavaScript. HTTP-only cookies +// cannot be cleared. +export function clearCookies(): void { + for (const cookie of document.cookie.split(";")) { + document.cookie = cookie + .replace(/^ +/, "") + .replace(/=.*/, `=;expires=${new Date(0).toUTCString()};path=/`); + } + window.localStorage.clear(); +} diff --git a/tests/util/msw_request_log.ts b/tests/util/msw_request_log.ts new file mode 100644 index 0000000000..a8e4982888 --- /dev/null +++ b/tests/util/msw_request_log.ts @@ -0,0 +1,128 @@ +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { type LifeCycleEventsMap, type SetupApi } from "msw"; + +interface RequestLogEntry { + request: { + url: string; + headers?: string[]; + body?: string; + }; + response: { + status: number; + body?: string; + }; +} + +export function mswRequestLog( + msw: SetupApi, + options: { + redact?: string[]; + } = {}, +) { + const redactPatterns = [ + "(?<=http://localhost:)[0-9]+", + ...(options.redact ?? []), + ]; + const redactRegexp = new RegExp( + redactPatterns.map((s) => `(?:${s})`).join("|"), + "g", + ); + const redact = (s: string) => s.replaceAll(redactRegexp, "*"); + const getHeaders = (headers: Headers): { headers?: string[] } => { + const list: string[] = []; + for (const [name, value] of headers.entries()) { + if (name === "accept" || name === "content-type") { + continue; + } + list.push(redact(`${name}: ${value}`)); + } + if (list.length === 0) return {}; + return { headers: list }; + }; + const getBody = async (r: Request | Response): Promise<{ body?: string }> => { + const body = redact(await r.text()); + if (!body) return {}; + return { body }; + }; + const log: Promise[] = []; + const outstandingRequests = new Map< + string, + { resolve: (value: RequestLogEntry) => void } + >(); + const handler = async ({ + request, + response, + requestId, + }: { + request: Request; + response: Response; + requestId: string; + }) => { + const resolvers = outstandingRequests.get(requestId); + if (resolvers === undefined) return; + outstandingRequests.delete(requestId); + request = request.clone(); + response = response.clone(); + const entry: RequestLogEntry = { + request: { + url: redact(request.url), + ...getHeaders(request.headers), + ...(await getBody(request)), + }, + response: { + status: response.status, + ...(await getBody(response)), + }, + }; + resolvers.resolve(entry); + }; + const requestHandler = ({ + request, + requestId, + }: { + request: Request; + requestId: string; + }) => { + if (new URL(request.url).origin === window.origin) { + return; + } + const { promise, resolve } = Promise.withResolvers(); + outstandingRequests.set(requestId, { resolve }); + log.push(promise); + }; + // request:start event is always sequenced before the `fetch` resolves, but + // `response:*` events sometimes don't. To avoid missing events, log entries + // are added on `response:start` and resolved by the corresponding + // `response:*` event. + msw.events.on("request:start", requestHandler); + msw.events.on("response:mocked", handler); + msw.events.on("response:bypass", handler); + return { + [Symbol.dispose]: () => { + msw.events.removeListener("request:start", requestHandler); + msw.events.removeListener("response:mocked", handler); + msw.events.removeListener("response:bypass", handler); + }, + log, + popAll: () => { + const result = log.slice(); + log.length = 0; + return Promise.all(result); + }, + }; +} diff --git a/tsconfig.json b/tsconfig.json index 7afac1fe53..ce7b970130 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,16 +12,17 @@ "strictNullChecks": true, "skipLibCheck": true, "allowSyntheticDefaultImports": true, - "allowImportingTsExtensions": true, + "allowImportingTsExtensions": false, "esModuleInterop": true, "sourceMap": true, "moduleResolution": "bundler", "incremental": true, "resolveJsonModule": true, - "target": "ES2017", + "useDefineForClassFields": true, + "target": "ES2022", "newLine": "LF", "baseUrl": ".", - "lib": ["dom", "webworker", "es2020", "dom.iterable"], + "lib": ["dom", "webworker", "esnext", "dom.iterable"], "typeRoots": [], "module": "ESNext", }, @@ -33,6 +34,7 @@ "testdata", "examples", "config", - "tests", + "docs", + "ngauth_server", ], } diff --git a/typings/index.d.ts b/typings/index.d.ts index ea8848a6c6..792d3785ed 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1,5 +1,2 @@ -/// -/// -/// +/// /// -/// diff --git a/typings/html.d.ts b/typings/raw.d.ts similarity index 65% rename from typings/html.d.ts rename to typings/raw.d.ts index 0877141d37..a20ce87840 100644 --- a/typings/html.d.ts +++ b/typings/raw.d.ts @@ -1,4 +1,4 @@ -declare module "*.html" { +declare module "*?raw" { const value: string; export default value; } diff --git a/vitest.workspace.ts b/vitest.workspace.ts index 00f4e15afb..5a4dba6b61 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1,29 +1,127 @@ -import { defineWorkspace } from "vitest/config"; +/** + * @license + * Copyright 2024 Google Inc. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import path from "node:path"; +import mswPlugin from "@iodigital/vite-plugin-msw"; +import type { ViteUserConfig } from "vitest/config"; +import { defineWorkspace, mergeConfig } from "vitest/config"; +import { getFakeGcsServerBin } from "./build_tools/vitest/build_fake_gcs_server.js"; +import { startFakeNgauthServer } from "./build_tools/vitest/fake_ngauth_server.js"; +import { + PYTHON_TEST_TOOLS_PATH, + syncPythonTools, +} from "./build_tools/vitest/python_tools.js"; +import { startTestDataServer } from "./build_tools/vitest/test_data_server.js"; + +const fakeNgauthServer = await startFakeNgauthServer(); +const testDataServer = await startTestDataServer( + path.join(import.meta.dirname, "testdata"), +); +const fakeGcsServerBin = await getFakeGcsServerBin(); +await syncPythonTools(); + +const commonDefines: Record = { + FAKE_NGAUTH_SERVER: JSON.stringify(fakeNgauthServer.url), + TEST_DATA_SERVER: JSON.stringify(testDataServer.url), +}; + +const browserDefines = { ...commonDefines }; +const nodeDefines = { + FAKE_GCS_SERVER_BIN: JSON.stringify(fakeGcsServerBin), + PYTHON_TEST_TOOLS_PATH: JSON.stringify(PYTHON_TEST_TOOLS_PATH), + ...commonDefines, +}; + +function defaultNodeProject(): ViteUserConfig { + return { + define: { ...nodeDefines }, + test: { + environment: "jsdom", + setupFiles: [ + "./build_tools/vitest/polyfill-browser-globals-in-node.ts", + "@vitest/web-worker", + ], + testTimeout: 10000, + }, + }; +} + +const KVSTORE_TESTS_WITH_CUSTOM_CONDITIONS = [ + { name: "zip" }, + { name: "ocdbt" }, + { name: "icechunk", conditions: ["neuroglancer/kvstore/s3:enabled"] }, +]; export default defineWorkspace([ - { + mergeConfig(defaultNodeProject(), { test: { name: "node", - environment: "node", - setupFiles: ["./build_tools/vitest/setup-crypto.ts"], - include: ["src/**/*.spec.ts"], + include: ["src/**/*.spec.ts", "tests/**/*.spec.ts"], + exclude: KVSTORE_TESTS_WITH_CUSTOM_CONDITIONS.map( + ({ name }) => `tests/kvstore/${name}.spec.ts`, + ), benchmark: { include: ["src/**/*.benchmark.ts"], }, }, - }, + }), + ...KVSTORE_TESTS_WITH_CUSTOM_CONDITIONS.map(({ name, conditions = [] }) => + mergeConfig(defaultNodeProject(), { + resolve: { + conditions: [ + "neuroglancer/datasource:none_by_default", + "neuroglancer/kvstore:none_by_default", + "neuroglancer/layer:none_by_default", + `neuroglancer/kvstore/${name}:enabled`, + "neuroglancer/kvstore/http:enabled", + ...conditions, + ], + }, + test: { + name: `kvstore/${name}`, + include: [`tests/kvstore/${name}.spec.ts`], + setupFiles: ["#src/kvstore/enabled_frontend_modules.js"], + }, + }), + ), { + define: browserDefines, + esbuild: { + target: "es2022", + }, + plugins: [mswPlugin({ mode: "browser", handlers: [] })], + optimizeDeps: { + entries: [ + "src/**/*.browser_test.ts", + "tests/**/*.browser_test.ts", + "src/*.bundle.js", + ], + }, test: { name: "browser", - include: ["src/**/*.browser_test.ts"], + include: ["src/**/*.browser_test.ts", "tests/**/*.browser_test.ts"], benchmark: { include: [], }, browser: { - provider: "webdriverio", + provider: "playwright", enabled: true, headless: true, - name: "chrome", + instances: [{ browser: "chromium" }], + screenshotFailures: false, }, }, },