From 4c6a876e026376af897ada21ef57642608a0ffe6 Mon Sep 17 00:00:00 2001 From: William Killerud Date: Thu, 7 Dec 2023 21:44:06 +0100 Subject: [PATCH] test: update to latest test-web, patch for search provider Awaiting feedback on PR upstream, but let's get this thing on CI --- .github/workflows/pull_request.yml | 3 + .vscode/launch.json | 64 +- .vscode/settings.json | 5 +- .vscode/tasks.json | 7 + CONTRIBUTING.md | 8 +- client/src/browser-client.ts | 10 +- client/src/client.ts | 5 + client/src/node-client.ts | 9 +- fixtures/e2e/.vscode/settings.json | 26 +- package.json | 7 +- server/src/file-system-provider.ts | 17 +- server/src/server.ts | 27 +- web/package-lock.json | 2742 ++++++++ web/package.json | 28 + web/patches/@vscode+test-web+0.0.49.patch | 6907 +++++++++++++++++++++ web/src/runTest.ts | 42 + web/src/suite/completion.test.ts | 337 + web/src/suite/definitions.test.ts | 79 + web/src/suite/example.test.ts | 11 + web/src/suite/hover.test.ts | 149 + web/src/suite/index.ts | 31 + web/src/suite/signature.test.ts | 244 + web/src/suite/util.ts | 42 + web/tsconfig.json | 11 + web/tsconfig.runtest.json | 4 + webpack.test-web.config.js | 67 + 26 files changed, 10831 insertions(+), 51 deletions(-) create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/patches/@vscode+test-web+0.0.49.patch create mode 100644 web/src/runTest.ts create mode 100644 web/src/suite/completion.test.ts create mode 100644 web/src/suite/definitions.test.ts create mode 100644 web/src/suite/example.test.ts create mode 100644 web/src/suite/hover.test.ts create mode 100644 web/src/suite/index.ts create mode 100644 web/src/suite/signature.test.ts create mode 100644 web/src/suite/util.ts create mode 100644 web/tsconfig.json create mode 100644 web/tsconfig.runtest.json create mode 100644 webpack.test-web.config.js diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 427e6999..0da2a4fb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -40,3 +40,6 @@ jobs: timeout_minutes: 5 max_attempts: 3 command: npm run test:e2e + + - name: Run web e2e tests + run: npm run test:web diff --git a/.vscode/launch.json b/.vscode/launch.json index 0aae23b0..249610f8 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -2,18 +2,6 @@ { "version": "0.2.0", "configurations": [ - { - "name": "Integration Tests", - "type": "extensionHost", - "request": "launch", - "runtimeExecutable": "${execPath}", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/e2e/out/suite", - "${workspaceFolder}/fixtures/e2e/" - ], - "outFiles": ["${workspaceFolder}/e2e/out/**/*.js"] - }, { "type": "extensionHost", "request": "launch", @@ -42,6 +30,58 @@ "type": "npm", "script": "dev" } + }, + { + "name": "Integration Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/e2e/out/suite", + "${workspaceFolder}/fixtures/e2e/" + ], + "outFiles": ["${workspaceFolder}/e2e/out/**/*.js"] + }, + { + "type": "chrome", + "request": "attach", + "name": "Attach to web integration test", + "skipFiles": ["/**"], + "port": 9229, + "timeout": 30000, // give it time to download vscode if needed + "resolveSourceMapLocations": [ + "!**/vs/**", // exclude core vscode sources + "!**/static/build/extensions/**" // exclude built-in extensions + ], + "presentation": { + "hidden": true + } + }, + { + "type": "node", + "request": "launch", + "name": "Launch web integration test", + "outputCapture": "std", + "program": "${workspaceFolder}/web/dist/runTest.js", + "args": ["--waitForDebugger=9229"], + "cascadeTerminateToConfigurations": ["Launch web integration test"], + "presentation": { + "hidden": true + }, + "preLaunchTask": { + "type": "npm", + "script": "pretest:web" + } + } + ], + "compounds": [ + { + "name": "Web Integration Tests", + "configurations": [ + "Launch web integration test", + "Attach to web integration test" + ] } ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index cec2f201..d04a8adb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,11 +7,8 @@ "**/bower_components/**" ], "somesass.scanImportedFiles": true, - "somesass.showErrors": false, "somesass.suggestAllFromOpenDocument": false, "somesass.suggestFromUseOnly": false, - "somesass.suggestVariables": true, - "somesass.suggestMixins": true, - "somesass.suggestFunctions": true, + "somesass.suggestionStyle": "all", "somesass.suggestFunctionsInStringContextAfterSymbols": " (+-*%" } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index fa7c1bf9..6f207d48 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -29,6 +29,13 @@ "reveal": "never" }, "problemMatcher": ["$ts-webpack-watch"] + }, + { + "type": "npm", + "script": "pretest:web", + "problemMatcher": [], + "label": "npm: pretest:web", + "detail": "webpack --config ./webpack.test-web.config.js && cd web && npm run compile" } ] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 776825ea..be70c285 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -126,4 +126,10 @@ Breakpoints set, go to the Run and Debug and run the Integration Tests configura ### Debugging integration tests for the web extension -Unfortunately there are no integration tests for the web version at the moment. +Like [debugging integration tests](#debugging-integration-tests), this is recommended only when you want to debug the tests themselves. The web integration tests can be found in `web/src/suite/`. + +Set breakpoints in the compiled output (`web/dist/suite/index.js`). + +> Note: at time of writing you may have to set the breakpoints after +> the debugger has attached. I've had the best success rate just +> spam clicking in the gutter to set the breakpoint :( diff --git a/client/src/browser-client.ts b/client/src/browser-client.ts index ce6040f8..7812ce3d 100644 --- a/client/src/browser-client.ts +++ b/client/src/browser-client.ts @@ -68,8 +68,14 @@ function getOuterMostWorkspaceFolder(folder: WorkspaceFolder): WorkspaceFolder { export async function activate(context: ExtensionContext): Promise { async function didOpenTextDocument(document: TextDocument): Promise { if ( - document.languageId !== "scss" || - (document.uri.scheme !== "file" && document.uri.scheme !== "untitled") + document.uri.scheme !== "file" && + document.uri.scheme !== "untitled" && + document.uri.scheme !== "vscode-vfs" && + document.uri.scheme !== "vscode-test-web" && + document.languageId !== "scss" && + document.languageId !== "vue" && + document.languageId !== "svelte" && + document.languageId !== "astro" ) { return; } diff --git a/client/src/client.ts b/client/src/client.ts index 77d3fa19..d1c97523 100644 --- a/client/src/client.ts +++ b/client/src/client.ts @@ -50,6 +50,7 @@ export function createLanguageClientOptions( * Otherwise, each client will participate in each workspace. */ const pattern = `${currentWorkspace.uri.fsPath.replace(/\\/g, "/")}/**`; + const webPattern = `${currentWorkspace.uri.path}**`; documentSelector = [ { scheme: "file", language: "scss", pattern }, @@ -60,6 +61,10 @@ export function createLanguageClientOptions( { scheme: "vscode-vfs", language: "vue", pattern }, { scheme: "vscode-vfs", language: "svelte", pattern }, { scheme: "vscode-vfs", language: "astro", pattern }, + { scheme: "vscode-test-web", language: "scss", pattern: webPattern }, + { scheme: "vscode-test-web", language: "vue", pattern: webPattern }, + { scheme: "vscode-test-web", language: "svelte", pattern: webPattern }, + { scheme: "vscode-test-web", language: "astro", pattern: webPattern }, ]; } diff --git a/client/src/node-client.ts b/client/src/node-client.ts index 62cc1a90..673c814b 100644 --- a/client/src/node-client.ts +++ b/client/src/node-client.ts @@ -71,8 +71,13 @@ export async function activate(context: ExtensionContext): Promise { async function didOpenTextDocument(document: TextDocument): Promise { if ( - document.languageId !== "scss" || - (document.uri.scheme !== "file" && document.uri.scheme !== "untitled") + document.uri.scheme !== "file" && + document.uri.scheme !== "untitled" && + document.uri.scheme !== "vscode-vfs" && + document.languageId !== "scss" && + document.languageId !== "vue" && + document.languageId !== "svelte" && + document.languageId !== "astro" ) { return; } diff --git a/fixtures/e2e/.vscode/settings.json b/fixtures/e2e/.vscode/settings.json index e14b2471..1702c152 100644 --- a/fixtures/e2e/.vscode/settings.json +++ b/fixtures/e2e/.vscode/settings.json @@ -1,16 +1,14 @@ { - "somesass.scannerDepth": 30, - "somesass.scannerExclude": [ - "**/.git/**", - "**/node_modules/**", - "**/bower_components/**" - ], - "somesass.scanImportedFiles": true, - "somesass.showErrors": false, - "somesass.suggestAllFromOpenDocument": false, - "somesass.suggestFromUseOnly": false, - "somesass.suggestVariables": true, - "somesass.suggestMixins": true, - "somesass.suggestFunctions": true, - "somesass.suggestFunctionsInStringContextAfterSymbols": " (+-*%" + "mochaExplorer.cwd": "server", + "somesass.scannerDepth": 30, + "somesass.scannerExclude": [ + "**/.git/**", + "**/node_modules/**", + "**/bower_components/**" + ], + "somesass.scanImportedFiles": true, + "somesass.suggestAllFromOpenDocument": false, + "somesass.suggestFromUseOnly": false, + "somesass.suggestionStyle": "all", + "somesass.suggestFunctionsInStringContextAfterSymbols": " (+-*%" } diff --git a/package.json b/package.json index 7b160b05..5e88588b 100644 --- a/package.json +++ b/package.json @@ -139,11 +139,16 @@ "vscode:prepublish": "npm run build", "clean": "rimraf dist", "build": "npm run clean && webpack --mode production --devtool hidden-source-map", + "build:debug": "npm run clean && webpack --mode development --devtool hidden-source-map", "dev": "webpack --mode development --watch", + "start:web": "vscode-test-web --browserType=chromium", + "start:test-web": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. ./fixtures/e2e", "lint": "eslint \"**/*.ts\" --cache", "test": "cd server && npm test", "test:e2e": "npm run build && cd e2e && npm test", - "postinstall": "cd client && npm install && cd ../e2e && npm install && cd ../server && npm install" + "pretest:web": "webpack --config ./webpack.test-web.config.js && cd web && npm run compile", + "test:web": "cd web && npm run test", + "postinstall": "cd client && npm install && cd ../e2e && npm install && cd ../server && npm install && cd ../web && npm install" }, "__metadata": { "id": "6d35099c-3671-464c-ac0b-34a0c3823927", diff --git a/server/src/file-system-provider.ts b/server/src/file-system-provider.ts index 6390f697..2b446182 100644 --- a/server/src/file-system-provider.ts +++ b/server/src/file-system-provider.ts @@ -48,10 +48,8 @@ export function getFileSystemProvider( return handler.stat(uri); } try { - const res = await connection.sendRequest( - FsStatRequest.type, - uri.toString(), - ); + const params = uri.toString(); + const res = await connection.sendRequest(FsStatRequest.type, params); return res as FileStat; } catch (e) { return { @@ -67,8 +65,10 @@ export function getFileSystemProvider( if (handler) { return await handler.readFile(uri); } + + const params = uri.toString(); const res = await connection.sendRequest(FsReadFileRequest.type, { - uri: uri.toString(), + uri: params, encoding, }); return res; @@ -108,10 +108,8 @@ export function getFileSystemProvider( } try { - const res = await connection.sendRequest( - FsStatRequest.type, - uri.toString(), - ); + const params = uri.toString(); + const res = await connection.sendRequest(FsStatRequest.type, params); const exists = res.type !== FileType.Unknown; return exists; } catch { @@ -123,7 +121,6 @@ export function getFileSystemProvider( if (handler) { return handler.realPath(uri); } - return Promise.resolve(uri); }, }; diff --git a/server/src/server.ts b/server/src/server.ts index 3b095767..6492674e 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -197,7 +197,12 @@ export class SomeSassServer { return null; } - const { storage } = useContext(); + const context = useContext(); + if (!context) { + return; + } + + const { storage } = context; const newFiles: URI[] = []; for (const change of event.changes) { const uri = URI.parse(change.uri); @@ -320,7 +325,12 @@ export class SomeSassServer { }); this.connection.onCodeAction(async (params) => { - const { editorSettings } = useContext(); + const context = useContext(); + if (!context) { + return; + } + + const { editorSettings } = context; const codeActionProviders = [new ExtractProvider(editorSettings)]; const document = documents.get(params.textDocument.uri); @@ -400,7 +410,12 @@ export class SomeSassServer { return null; } - const { storage } = useContext(); + const context = useContext(); + if (!context) { + return null; + } + + const { storage } = context; const scssDocument = storage.get(document.uri); if (!scssDocument) { // For the first open document, we may have a race condition where the scanner @@ -430,8 +445,10 @@ export class SomeSassServer { }); this.connection.onShutdown(() => { - const { storage } = useContext(); - storage.clear(); + const context = useContext(); + if (context) { + context.storage.clear(); + } }); this.connection.listen(); diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 00000000..c9844929 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,2742 @@ +{ + "name": "some-sass-web", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "some-sass-web", + "version": "1.0.0", + "hasInstallScript": true, + "license": "MIT", + "devDependencies": { + "@types/mocha": "10.0.6", + "@types/vscode": "1.84.2", + "@vscode/test-web": "0.0.49", + "assert": "2.1.0", + "mocha": "10.2.0", + "patch-package": "^8.0.0", + "vscode-languageserver": "^9.0.1" + }, + "engines": { + "vscode": "^1.66.0" + } + }, + "node_modules/@koa/cors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-4.0.0.tgz", + "integrity": "sha512-Y4RrbvGTlAaa04DBoPBWJqDR5gPj32OOz827ULXfgB1F7piD1MB/zwn8JR2LAnvdILhxUbXbkXGWuNVsFuVFCQ==", + "dev": true, + "dependencies": { + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@koa/router": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/@koa/router/-/router-12.0.1.tgz", + "integrity": "sha512-ribfPYfHb+Uw3b27Eiw6NPqjhIhTpVFzEWLwyc/1Xp+DCdwRRyIlAUODX+9bPARF6aQtUu1+/PHzdNvRzcs/+Q==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "http-errors": "^2.0.0", + "koa-compose": "^4.1.0", + "methods": "^1.1.2", + "path-to-regexp": "^6.2.1" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/@playwright/browser-chromium": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.40.1.tgz", + "integrity": "sha512-uNmjHYXBTYTfJkf89D6zVUcesCFzZ/yjkPj8FvBJQ6yf3na/j1rcjVNzx0PzOAGcWKioB/rnWRBi7b5ojOdCHA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "playwright-core": "1.40.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.84.2", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.2.tgz", + "integrity": "sha512-LCe1FvCDMJKkPdLVGYhP0HRJ1PDop2gRVm/zFHiOKwYLBRS7vEV3uOOUId4HMV+L1IxqyS+IZXMmlSMRbZGIAw==", + "dev": true + }, + "node_modules/@vscode/test-web": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/@vscode/test-web/-/test-web-0.0.49.tgz", + "integrity": "sha512-6L+1SoDQ96O2UtrWjj0se7IVRPHrzVL12YYTkSEQAuftdkcHl3TP5FjlcrlN+TrXWNX9r9jRn7vo/hoItsdQRw==", + "dev": true, + "dependencies": { + "@koa/cors": "^4.0.0", + "@koa/router": "^12.0.1", + "@playwright/browser-chromium": "^1.40.1", + "gunzip-maybe": "^1.4.2", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "koa": "^2.14.2", + "koa-morgan": "^1.0.1", + "koa-mount": "^4.0.0", + "koa-static": "^5.0.0", + "minimist": "^1.2.8", + "playwright": "^1.40.1", + "tar-fs": "^3.0.4", + "vscode-uri": "^3.0.8" + }, + "bin": { + "vscode-test-web": "out/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "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/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "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/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/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" + } + }, + "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/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "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==", + "dev": 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": ">= 0.8" + } + }, + "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/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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.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==", + "dev": true + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dev": true, + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/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": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/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/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": { + "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/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dev": true, + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true + }, + "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==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "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/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": 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==", + "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/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.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/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/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/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, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/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/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/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==", + "dev": true, + "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/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "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.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "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/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob/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/glob/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/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", + "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/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", + "dev": true, + "dependencies": { + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" + }, + "bin": { + "gunzip-maybe": "bin.js" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-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==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-assert/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-assert/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/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-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-gzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-stable-stringify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", + "integrity": "sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify/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/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/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dev": true, + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/koa": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", + "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", + "dev": true, + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/koa-morgan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa-morgan/-/koa-morgan-1.0.1.tgz", + "integrity": "sha512-JOUdCNlc21G50afBXfErUrr1RKymbgzlrO5KURY+wmDG1Uvd2jmxUJcHgylb/mYXy2SjiNZyYim/ptUBGsIi3A==", + "dev": true, + "dependencies": { + "morgan": "^1.6.1" + } + }, + "node_modules/koa-mount": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/koa-mount/-/koa-mount-4.0.0.tgz", + "integrity": "sha512-rm71jaA/P+6HeCpoRhmCv8KVBIi0tfGuO/dMKicbQnQW/YJntJ6MnnspkodoA4QstMVEZArsCphmd0bJEtoMjQ==", + "dev": true, + "dependencies": { + "debug": "^4.0.1", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/koa-send/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-send/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/koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "engines": { + "node": ">= 7.6.0" + } + }, + "node_modules/koa-static/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/koa/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/http-errors/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/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/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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/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": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/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/morgan/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/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "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.6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", + "dev": true + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, + "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.8" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", + "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "dev": true + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, + "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/sponsors/jonschlinkert" + } + }, + "node_modules/playwright": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", + "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "dev": true, + "dependencies": { + "playwright-core": "1.40.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.40.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", + "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "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/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "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/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "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/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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/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/resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "dev": true, + "dependencies": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/resolve-path/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, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/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, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/resolve-path/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/resolve-path/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 + }, + "node_modules/resolve-path/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/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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==", + "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/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "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", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/streamx": { + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", + "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/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": "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dev": true, + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-fs/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==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/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/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, + "engines": { + "node": ">=0.6.x" + } + }, + "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/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/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true, + "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/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ylru": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 00000000..11b9fd12 --- /dev/null +++ b/web/package.json @@ -0,0 +1,28 @@ +{ + "name": "some-sass-web", + "description": "End-to-end tests for vscode-scss web", + "publisher": "SomewhatStationery", + "license": "MIT", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "https://github.com/wkillerud/vscode-scss" + }, + "engines": { + "vscode": "^1.66.0" + }, + "devDependencies": { + "@types/mocha": "10.0.6", + "@types/vscode": "1.84.2", + "@vscode/test-web": "0.0.49", + "assert": "2.1.0", + "mocha": "10.2.0", + "patch-package": "^8.0.0", + "vscode-languageserver": "^9.0.1" + }, + "scripts": { + "compile": "tsc -p tsconfig.runtest.json", + "test": "node ./dist/runTest.js", + "postinstall": "patch-package" + } +} diff --git a/web/patches/@vscode+test-web+0.0.49.patch b/web/patches/@vscode+test-web+0.0.49.patch new file mode 100644 index 00000000..cfe8a2bb --- /dev/null +++ b/web/patches/@vscode+test-web+0.0.49.patch @@ -0,0 +1,6907 @@ +diff --git a/node_modules/@vscode/test-web/fs-provider/dist/fsExtensionMain.js b/node_modules/@vscode/test-web/fs-provider/dist/fsExtensionMain.js +index 2510622..2ee2bd0 100644 +--- a/node_modules/@vscode/test-web/fs-provider/dist/fsExtensionMain.js ++++ b/node_modules/@vscode/test-web/fs-provider/dist/fsExtensionMain.js +@@ -4,566 +4,2727 @@ + /* 1 */ + /***/ ((__unused_webpack_module, exports) => { + +-(()=>{"use strict";var e={};(()=>{var r=e;Object.defineProperty(r,"__esModule",{value:!0}),r.getErrorStatusDescription=r.xhr=r.configure=void 0,r.configure=(e,r)=>{},r.xhr=async e=>{const r=new Headers;if(e.headers)for(const t in e.headers){const o=e.headers[t];Array.isArray(o)?o.forEach((e=>r.set(t,e))):r.set(t,o)}e.user&&e.password&&r.set("Authorization","Basic "+btoa(e.user+":"+e.password));const t={method:e.type,redirect:e.followRedirects>0?"follow":"manual",mode:"cors",headers:r};if(e.data&&(t.body=e.data),e.token){const r=new AbortController;e.token.isCancellationRequested&&r.abort(),e.token.onCancellationRequested((()=>{r.abort()})),t.signal=r.signal}const o=new Request(e.url,t),s=await fetch(o),a={};s.headers.forEach(((e,r)=>{a[r]=e}));const n=await s.arrayBuffer();return new class{constructor(){this.status=s.status,this.headers=a}get responseText(){return(new TextDecoder).decode(n)}get body(){return new Uint8Array(n)}}},r.getErrorStatusDescription=function(e){return String(e)}})();var r=exports;for(var t in e)r[t]=e[t];e.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})(); +- +-/***/ }), +-/* 2 */ +-/***/ ((module) => { +- +-"use strict"; +-module.exports = require("vscode"); +- +-/***/ }), +-/* 3 */ +-/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +- +-"use strict"; +- +-/*--------------------------------------------------------------------------------------------- +- * Copyright (c) Microsoft Corporation. All rights reserved. +- * Licensed under the MIT License. See License.txt in the project root for license information. +- *--------------------------------------------------------------------------------------------*/ +-Object.defineProperty(exports, "__esModule", ({ value: true })); +-exports.MemFileSystemProvider = void 0; +-const vscode_1 = __webpack_require__(2); +-const vscode_uri_1 = __webpack_require__(4); +-function newFileStat(type, size) { +- return Promise.resolve({ type, ctime: Date.now(), mtime: Date.now(), size }); +-} +-function modifiedFileStat(stats, size) { +- return Promise.resolve({ type: stats.type, ctime: stats.ctime, mtime: Date.now(), size: size ?? stats.size }); +-} +-class MemFileSystemProvider { +- constructor(scheme, root) { +- this.scheme = scheme; +- this.root = root; +- // --- manage file events +- this._onDidChangeFile = new vscode_1.EventEmitter(); +- this.onDidChangeFile = this._onDidChangeFile.event; +- this._bufferedChanges = []; +- } +- // --- manage file metadata +- async stat(resource) { +- const entry = await this._lookup(resource, false); +- return entry.stats; +- } +- async readDirectory(resource) { +- const entry = await this._lookupAsDirectory(resource, false); +- const entries = await entry.entries; +- const result = []; +- entries.forEach((child, name) => result.push([name, child.type])); +- return result; +- } +- // --- manage file contents +- async readFile(resource) { +- const entry = await this._lookupAsFile(resource, false); +- return entry.content; +- } +- async writeFile(uri, content, opts) { +- const basename = vscode_uri_1.Utils.basename(uri); +- const parent = await this._lookupParentDirectory(uri); +- const entries = await parent.entries; +- let entry = entries.get(basename); +- if (entry && entry.type === vscode_1.FileType.Directory) { +- throw vscode_1.FileSystemError.FileIsADirectory(uri); +- } +- if (!entry && !opts.create) { +- throw vscode_1.FileSystemError.FileNotFound(uri); +- } +- if (entry && opts.create && !opts.overwrite) { +- throw vscode_1.FileSystemError.FileExists(uri); +- } +- const stats = newFileStat(vscode_1.FileType.File, content.byteLength); +- if (!entry) { +- entry = { type: vscode_1.FileType.File, name: basename, stats, content: Promise.resolve(content) }; +- entries.set(basename, entry); +- this._fireSoon({ type: vscode_1.FileChangeType.Created, uri }); +- } +- else { +- entry.stats = stats; +- entry.content = Promise.resolve(content); +- } +- this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri }); +- } +- // --- manage files/folders +- async rename(from, to, opts) { +- if (!opts.overwrite && await this._lookup(to, true)) { +- throw vscode_1.FileSystemError.FileExists(to); +- } +- const entry = await this._lookup(from, false); +- const oldParent = await this._lookupParentDirectory(from); +- const newParent = await this._lookupParentDirectory(to); +- const newName = vscode_uri_1.Utils.basename(to); +- const oldParentEntries = await oldParent.entries; +- oldParentEntries.delete(entry.name); +- entry.name = newName; +- const newParentEntries = await newParent.entries; +- newParentEntries.set(newName, entry); +- this._fireSoon({ type: vscode_1.FileChangeType.Deleted, uri: from }, { type: vscode_1.FileChangeType.Created, uri: to }); +- } +- async delete(uri, opts) { +- const dirname = vscode_uri_1.Utils.dirname(uri); +- const basename = vscode_uri_1.Utils.basename(uri); +- const parent = await this._lookupAsDirectory(dirname, false); +- const parentEntries = await parent.entries; +- if (parentEntries.has(basename)) { +- parentEntries.delete(basename); +- parent.stats = newFileStat(parent.type, -1); +- this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri: dirname }, { uri, type: vscode_1.FileChangeType.Deleted }); +- } +- } +- async createDirectory(uri) { +- const basename = vscode_uri_1.Utils.basename(uri); +- const dirname = vscode_uri_1.Utils.dirname(uri); +- const parent = await this._lookupAsDirectory(dirname, false); +- const parentEntries = await parent.entries; +- const entry = { type: vscode_1.FileType.Directory, name: basename, stats: newFileStat(vscode_1.FileType.Directory, 0), entries: Promise.resolve(new Map()) }; +- parentEntries.set(entry.name, entry); +- const stats = await parent.stats; +- parent.stats = modifiedFileStat(stats, stats.size + 1); +- this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri: dirname }, { type: vscode_1.FileChangeType.Created, uri }); +- } +- async _lookup(uri, silent) { +- if (uri.scheme !== this.scheme) { +- if (!silent) { +- throw vscode_1.FileSystemError.FileNotFound(uri); +- } +- else { +- return undefined; +- } +- } +- let entry = this.root; +- const parts = uri.path.split('/'); +- for (const part of parts) { +- if (!part) { +- continue; +- } +- let child; +- if (entry.type === vscode_1.FileType.Directory) { +- child = (await entry.entries).get(part); +- } +- if (!child) { +- if (!silent) { +- throw vscode_1.FileSystemError.FileNotFound(uri); +- } +- else { +- return undefined; +- } +- } +- entry = child; +- } +- return entry; +- } +- async _lookupAsDirectory(uri, silent) { +- const entry = await this._lookup(uri, silent); +- if (entry?.type === vscode_1.FileType.Directory) { +- return entry; +- } +- throw vscode_1.FileSystemError.FileNotADirectory(uri); +- } +- async _lookupAsFile(uri, silent) { +- const entry = await this._lookup(uri, silent); +- if (!entry) { +- throw vscode_1.FileSystemError.FileNotFound(uri); +- } +- if (entry.type === vscode_1.FileType.File) { +- return entry; +- } +- throw vscode_1.FileSystemError.FileIsADirectory(uri); +- } +- _lookupParentDirectory(uri) { +- const dirname = vscode_uri_1.Utils.dirname(uri); +- return this._lookupAsDirectory(dirname, false); +- } +- watch(resource, opts) { +- // ignore, fires for all changes... +- return vscode_1.Disposable.from(); +- } +- _fireSoon(...changes) { +- this._bufferedChanges.push(...changes); +- if (this._fireSoonHandle) { +- clearTimeout(this._fireSoonHandle); +- } +- this._fireSoonHandle = setTimeout(() => { +- this._onDidChangeFile.fire(this._bufferedChanges); +- this._bufferedChanges.length = 0; +- }, 5); +- } +- dispose() { +- this._onDidChangeFile.dispose(); +- } +-} +-exports.MemFileSystemProvider = MemFileSystemProvider; +- +- +-/***/ }), +-/* 4 */ +-/***/ (function(module, __unused_webpack_exports, __webpack_require__) { +- +-/* provided dependency */ var process = __webpack_require__(5); +-!function(t,e){if(true)module.exports=e();else { var n, r; }}(this,(()=>(()=>{"use strict";var t={470:t=>{function e(t){if("string"!=typeof t)throw new TypeError("Path must be a string. Received "+JSON.stringify(t))}function r(t,e){for(var r,n="",i=0,o=-1,s=0,a=0;a<=t.length;++a){if(a2){var h=n.lastIndexOf("/");if(h!==n.length-1){-1===h?(n="",i=0):i=(n=n.slice(0,h)).length-1-n.lastIndexOf("/"),o=a,s=0;continue}}else if(2===n.length||1===n.length){n="",i=0,o=a,s=0;continue}e&&(n.length>0?n+="/..":n="..",i=2)}else n.length>0?n+="/"+t.slice(o+1,a):n=t.slice(o+1,a),i=a-o-1;o=a,s=0}else 46===r&&-1!==s?++s:s=-1}return n}var n={resolve:function(){for(var t,n="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var s;o>=0?s=arguments[o]:(void 0===t&&(t=process.cwd()),s=t),e(s),0!==s.length&&(n=s+"/"+n,i=47===s.charCodeAt(0))}return n=r(n,!i),i?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize:function(t){if(e(t),0===t.length)return".";var n=47===t.charCodeAt(0),i=47===t.charCodeAt(t.length-1);return 0!==(t=r(t,!n)).length||n||(t="."),t.length>0&&i&&(t+="/"),n?"/"+t:t},isAbsolute:function(t){return e(t),t.length>0&&47===t.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var t,r=0;r0&&(void 0===t?t=i:t+="/"+i)}return void 0===t?".":n.normalize(t)},relative:function(t,r){if(e(t),e(r),t===r)return"";if((t=n.resolve(t))===(r=n.resolve(r)))return"";for(var i=1;ic){if(47===r.charCodeAt(a+u))return r.slice(a+u+1);if(0===u)return r.slice(a+u)}else s>c&&(47===t.charCodeAt(i+u)?f=u:0===u&&(f=0));break}var l=t.charCodeAt(i+u);if(l!==r.charCodeAt(a+u))break;47===l&&(f=u)}var d="";for(u=i+f+1;u<=o;++u)u!==o&&47!==t.charCodeAt(u)||(0===d.length?d+="..":d+="/..");return d.length>0?d+r.slice(a+f):(a+=f,47===r.charCodeAt(a)&&++a,r.slice(a))},_makeLong:function(t){return t},dirname:function(t){if(e(t),0===t.length)return".";for(var r=t.charCodeAt(0),n=47===r,i=-1,o=!0,s=t.length-1;s>=1;--s)if(47===(r=t.charCodeAt(s))){if(!o){i=s;break}}else o=!1;return-1===i?n?"/":".":n&&1===i?"//":t.slice(0,i)},basename:function(t,r){if(void 0!==r&&"string"!=typeof r)throw new TypeError('"ext" argument must be a string');e(t);var n,i=0,o=-1,s=!0;if(void 0!==r&&r.length>0&&r.length<=t.length){if(r.length===t.length&&r===t)return"";var a=r.length-1,h=-1;for(n=t.length-1;n>=0;--n){var c=t.charCodeAt(n);if(47===c){if(!s){i=n+1;break}}else-1===h&&(s=!1,h=n+1),a>=0&&(c===r.charCodeAt(a)?-1==--a&&(o=n):(a=-1,o=h))}return i===o?o=h:-1===o&&(o=t.length),t.slice(i,o)}for(n=t.length-1;n>=0;--n)if(47===t.charCodeAt(n)){if(!s){i=n+1;break}}else-1===o&&(s=!1,o=n+1);return-1===o?"":t.slice(i,o)},extname:function(t){e(t);for(var r=-1,n=0,i=-1,o=!0,s=0,a=t.length-1;a>=0;--a){var h=t.charCodeAt(a);if(47!==h)-1===i&&(o=!1,i=a+1),46===h?-1===r?r=a:1!==s&&(s=1):-1!==r&&(s=-1);else if(!o){n=a+1;break}}return-1===r||-1===i||0===s||1===s&&r===i-1&&r===n+1?"":t.slice(r,i)},format:function(t){if(null===t||"object"!=typeof t)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof t);return function(t,e){var r=e.dir||e.root,n=e.base||(e.name||"")+(e.ext||"");return r?r===e.root?r+n:r+"/"+n:n}(0,t)},parse:function(t){e(t);var r={root:"",dir:"",base:"",ext:"",name:""};if(0===t.length)return r;var n,i=t.charCodeAt(0),o=47===i;o?(r.root="/",n=1):n=0;for(var s=-1,a=0,h=-1,c=!0,f=t.length-1,u=0;f>=n;--f)if(47!==(i=t.charCodeAt(f)))-1===h&&(c=!1,h=f+1),46===i?-1===s?s=f:1!==u&&(u=1):-1!==s&&(u=-1);else if(!c){a=f+1;break}return-1===s||-1===h||0===u||1===u&&s===h-1&&s===a+1?-1!==h&&(r.base=r.name=0===a&&o?t.slice(1,h):t.slice(a,h)):(0===a&&o?(r.name=t.slice(1,s),r.base=t.slice(1,h)):(r.name=t.slice(a,s),r.base=t.slice(a,h)),r.ext=t.slice(s,h)),a>0?r.dir=t.slice(0,a-1):o&&(r.dir="/"),r},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n},674:(t,e)=>{if(Object.defineProperty(e,"__esModule",{value:!0}),e.isWindows=void 0,"object"==typeof process)e.isWindows="win32"===process.platform;else if("object"==typeof navigator){let t=navigator.userAgent;e.isWindows=t.indexOf("Windows")>=0}},796:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.uriToFsPath=e.URI=void 0;const n=r(674),i=/^\w[\w\d+.-]*$/,o=/^\//,s=/^\/\//;function a(t,e){if(!t.scheme&&e)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${t.authority}", path: "${t.path}", query: "${t.query}", fragment: "${t.fragment}"}`);if(t.scheme&&!i.test(t.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(t.path)if(t.authority){if(!o.test(t.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(s.test(t.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}const h="",c="/",f=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class u{static isUri(t){return t instanceof u||!!t&&"string"==typeof t.authority&&"string"==typeof t.fragment&&"string"==typeof t.path&&"string"==typeof t.query&&"string"==typeof t.scheme&&"string"==typeof t.fsPath&&"function"==typeof t.with&&"function"==typeof t.toString}scheme;authority;path;query;fragment;constructor(t,e,r,n,i,o=!1){"object"==typeof t?(this.scheme=t.scheme||h,this.authority=t.authority||h,this.path=t.path||h,this.query=t.query||h,this.fragment=t.fragment||h):(this.scheme=function(t,e){return t||e?t:"file"}(t,o),this.authority=e||h,this.path=function(t,e){switch(t){case"https":case"http":case"file":e?e[0]!==c&&(e=c+e):e=c}return e}(this.scheme,r||h),this.query=n||h,this.fragment=i||h,a(this,o))}get fsPath(){return v(this,!1)}with(t){if(!t)return this;let{scheme:e,authority:r,path:n,query:i,fragment:o}=t;return void 0===e?e=this.scheme:null===e&&(e=h),void 0===r?r=this.authority:null===r&&(r=h),void 0===n?n=this.path:null===n&&(n=h),void 0===i?i=this.query:null===i&&(i=h),void 0===o?o=this.fragment:null===o&&(o=h),e===this.scheme&&r===this.authority&&n===this.path&&i===this.query&&o===this.fragment?this:new d(e,r,n,i,o)}static parse(t,e=!1){const r=f.exec(t);return r?new d(r[2]||h,w(r[4]||h),w(r[5]||h),w(r[7]||h),w(r[9]||h),e):new d(h,h,h,h,h)}static file(t){let e=h;if(n.isWindows&&(t=t.replace(/\\/g,c)),t[0]===c&&t[1]===c){const r=t.indexOf(c,2);-1===r?(e=t.substring(2),t=c):(e=t.substring(2,r),t=t.substring(r)||c)}return new d("file",e,t,h,h)}static from(t){const e=new d(t.scheme,t.authority,t.path,t.query,t.fragment);return a(e,!0),e}toString(t=!1){return y(this,t)}toJSON(){return this}static revive(t){if(t){if(t instanceof u)return t;{const e=new d(t);return e._formatted=t.external,e._fsPath=t._sep===l?t.fsPath:null,e}}return t}}e.URI=u;const l=n.isWindows?1:void 0;class d extends u{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=v(this,!1)),this._fsPath}toString(t=!1){return t?y(this,!0):(this._formatted||(this._formatted=y(this,!1)),this._formatted)}toJSON(){const t={$mid:1};return this._fsPath&&(t.fsPath=this._fsPath,t._sep=l),this._formatted&&(t.external=this._formatted),this.path&&(t.path=this.path),this.scheme&&(t.scheme=this.scheme),this.authority&&(t.authority=this.authority),this.query&&(t.query=this.query),this.fragment&&(t.fragment=this.fragment),t}}const p={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function g(t,e,r){let n,i=-1;for(let o=0;o=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57||45===s||46===s||95===s||126===s||e&&47===s||r&&91===s||r&&93===s||r&&58===s)-1!==i&&(n+=encodeURIComponent(t.substring(i,o)),i=-1),void 0!==n&&(n+=t.charAt(o));else{void 0===n&&(n=t.substr(0,o));const e=p[s];void 0!==e?(-1!==i&&(n+=encodeURIComponent(t.substring(i,o)),i=-1),n+=e):-1===i&&(i=o)}}return-1!==i&&(n+=encodeURIComponent(t.substring(i))),void 0!==n?n:t}function m(t){let e;for(let r=0;r1&&"file"===t.scheme?`//${t.authority}${t.path}`:47===t.path.charCodeAt(0)&&(t.path.charCodeAt(1)>=65&&t.path.charCodeAt(1)<=90||t.path.charCodeAt(1)>=97&&t.path.charCodeAt(1)<=122)&&58===t.path.charCodeAt(2)?e?t.path.substr(1):t.path[1].toLowerCase()+t.path.substr(2):t.path,n.isWindows&&(r=r.replace(/\//g,"\\")),r}function y(t,e){const r=e?m:g;let n="",{scheme:i,authority:o,path:s,query:a,fragment:h}=t;if(i&&(n+=i,n+=":"),(o||"file"===i)&&(n+=c,n+=c),o){let t=o.indexOf("@");if(-1!==t){const e=o.substr(0,t);o=o.substr(t+1),t=e.lastIndexOf(":"),-1===t?n+=r(e,!1,!1):(n+=r(e.substr(0,t),!1,!1),n+=":",n+=r(e.substr(t+1),!1,!0)),n+="@"}o=o.toLowerCase(),t=o.lastIndexOf(":"),-1===t?n+=r(o,!1,!0):(n+=r(o.substr(0,t),!1,!0),n+=o.substr(t))}if(s){if(s.length>=3&&47===s.charCodeAt(0)&&58===s.charCodeAt(2)){const t=s.charCodeAt(1);t>=65&&t<=90&&(s=`/${String.fromCharCode(t+32)}:${s.substr(3)}`)}else if(s.length>=2&&58===s.charCodeAt(1)){const t=s.charCodeAt(0);t>=65&&t<=90&&(s=`${String.fromCharCode(t+32)}:${s.substr(2)}`)}n+=r(s,!0,!1)}return a&&(n+="?",n+=r(a,!1,!1)),h&&(n+="#",n+=e?h:g(h,!1,!1)),n}function b(t){try{return decodeURIComponent(t)}catch{return t.length>3?t.substr(0,3)+b(t.substr(3)):t}}e.uriToFsPath=v;const C=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function w(t){return t.match(C)?t.replace(C,(t=>b(t))):t}},679:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);i&&!("get"in i?!e.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),o=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return i(e,t),e};Object.defineProperty(e,"__esModule",{value:!0}),e.Utils=void 0;const s=o(r(470)),a=s.posix||s,h="/";var c;!function(t){t.joinPath=function(t,...e){return t.with({path:a.join(t.path,...e)})},t.resolvePath=function(t,...e){let r=t.path,n=!1;r[0]!==h&&(r=h+r,n=!0);let i=a.resolve(r,...e);return n&&i[0]===h&&!t.authority&&(i=i.substring(1)),t.with({path:i})},t.dirname=function(t){if(0===t.path.length||t.path===h)return t;let e=a.dirname(t.path);return 1===e.length&&46===e.charCodeAt(0)&&(e=""),t.with({path:e})},t.basename=function(t){return a.basename(t.path)},t.extname=function(t){return a.extname(t.path)}}(c||(e.Utils=c={}))}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,r),o.exports}var n={};return(()=>{var t=n;Object.defineProperty(t,"__esModule",{value:!0}),t.Utils=t.URI=void 0;const e=r(796);Object.defineProperty(t,"URI",{enumerable:!0,get:function(){return e.URI}});const i=r(679);Object.defineProperty(t,"Utils",{enumerable:!0,get:function(){return i.Utils}})})(),n})())); +-//# sourceMappingURL=index.js.map +- +-/***/ }), +-/* 5 */ +-/***/ ((module) => { +- +-// shim for using process in browser +-var process = module.exports = {}; +- +-// cached from whatever global is present so that test runners that stub it +-// don't break things. But we need to wrap it in a try catch in case it is +-// wrapped in strict mode code which doesn't define any globals. It's inside a +-// function because try/catches deoptimize in certain engines. +- +-var cachedSetTimeout; +-var cachedClearTimeout; +- +-function defaultSetTimout() { +- throw new Error('setTimeout has not been defined'); +-} +-function defaultClearTimeout () { +- throw new Error('clearTimeout has not been defined'); +-} +-(function () { +- try { +- if (typeof setTimeout === 'function') { +- cachedSetTimeout = setTimeout; +- } else { +- cachedSetTimeout = defaultSetTimout; +- } +- } catch (e) { +- cachedSetTimeout = defaultSetTimout; +- } +- try { +- if (typeof clearTimeout === 'function') { +- cachedClearTimeout = clearTimeout; +- } else { +- cachedClearTimeout = defaultClearTimeout; +- } +- } catch (e) { +- cachedClearTimeout = defaultClearTimeout; +- } +-} ()) +-function runTimeout(fun) { +- if (cachedSetTimeout === setTimeout) { +- //normal enviroments in sane situations +- return setTimeout(fun, 0); +- } +- // if setTimeout wasn't available but was latter defined +- if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { +- cachedSetTimeout = setTimeout; +- return setTimeout(fun, 0); +- } +- try { +- // when when somebody has screwed with setTimeout but no I.E. maddness +- return cachedSetTimeout(fun, 0); +- } catch(e){ +- try { +- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally +- return cachedSetTimeout.call(null, fun, 0); +- } catch(e){ +- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error +- return cachedSetTimeout.call(this, fun, 0); +- } +- } +- +- +-} +-function runClearTimeout(marker) { +- if (cachedClearTimeout === clearTimeout) { +- //normal enviroments in sane situations +- return clearTimeout(marker); +- } +- // if clearTimeout wasn't available but was latter defined +- if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { +- cachedClearTimeout = clearTimeout; +- return clearTimeout(marker); +- } +- try { +- // when when somebody has screwed with setTimeout but no I.E. maddness +- return cachedClearTimeout(marker); +- } catch (e){ +- try { +- // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally +- return cachedClearTimeout.call(null, marker); +- } catch (e){ +- // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. +- // Some versions of I.E. have different rules for clearTimeout vs setTimeout +- return cachedClearTimeout.call(this, marker); +- } +- } +- +- +- +-} +-var queue = []; +-var draining = false; +-var currentQueue; +-var queueIndex = -1; +- +-function cleanUpNextTick() { +- if (!draining || !currentQueue) { +- return; +- } +- draining = false; +- if (currentQueue.length) { +- queue = currentQueue.concat(queue); +- } else { +- queueIndex = -1; +- } +- if (queue.length) { +- drainQueue(); +- } +-} +- +-function drainQueue() { +- if (draining) { +- return; +- } +- var timeout = runTimeout(cleanUpNextTick); +- draining = true; +- +- var len = queue.length; +- while(len) { +- currentQueue = queue; +- queue = []; +- while (++queueIndex < len) { +- if (currentQueue) { +- currentQueue[queueIndex].run(); +- } +- } +- queueIndex = -1; +- len = queue.length; +- } +- currentQueue = null; +- draining = false; +- runClearTimeout(timeout); +-} +- +-process.nextTick = function (fun) { +- var args = new Array(arguments.length - 1); +- if (arguments.length > 1) { +- for (var i = 1; i < arguments.length; i++) { +- args[i - 1] = arguments[i]; +- } +- } +- queue.push(new Item(fun, args)); +- if (queue.length === 1 && !draining) { +- runTimeout(drainQueue); +- } +-}; +- +-// v8 likes predictible objects +-function Item(fun, array) { +- this.fun = fun; +- this.array = array; +-} +-Item.prototype.run = function () { +- this.fun.apply(null, this.array); +-}; +-process.title = 'browser'; +-process.browser = true; +-process.env = {}; +-process.argv = []; +-process.version = ''; // empty string to avoid regexp issues +-process.versions = {}; +- +-function noop() {} +- +-process.on = noop; +-process.addListener = noop; +-process.once = noop; +-process.off = noop; +-process.removeListener = noop; +-process.removeAllListeners = noop; +-process.emit = noop; +-process.prependListener = noop; +-process.prependOnceListener = noop; +- +-process.listeners = function (name) { return [] } +- +-process.binding = function (name) { +- throw new Error('process.binding is not supported'); +-}; +- +-process.cwd = function () { return '/' }; +-process.chdir = function (dir) { +- throw new Error('process.chdir is not supported'); +-}; +-process.umask = function() { return 0; }; +- +- +-/***/ }) +-/******/ ]); +-/************************************************************************/ +-/******/ // The module cache +-/******/ var __webpack_module_cache__ = {}; +-/******/ +-/******/ // The require function +-/******/ function __webpack_require__(moduleId) { +-/******/ // Check if module is in cache +-/******/ var cachedModule = __webpack_module_cache__[moduleId]; +-/******/ if (cachedModule !== undefined) { +-/******/ return cachedModule.exports; +-/******/ } +-/******/ // Create a new module (and put it into the cache) +-/******/ var module = __webpack_module_cache__[moduleId] = { +-/******/ // no module.id needed +-/******/ // no module.loaded needed +-/******/ exports: {} +-/******/ }; +-/******/ +-/******/ // Execute the module function +-/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +-/******/ +-/******/ // Return the exports of the module +-/******/ return module.exports; +-/******/ } +-/******/ +-/************************************************************************/ +-var __webpack_exports__ = {}; +-// This entry need to be wrapped in an IIFE because it need to be in strict mode. +-(() => { +-"use strict"; +-var exports = __webpack_exports__; +- +-/*--------------------------------------------------------------------------------------------- +- * Copyright (c) Microsoft Corporation. All rights reserved. +- * Licensed under the MIT License. See License.txt in the project root for license information. +- *--------------------------------------------------------------------------------------------*/ +-Object.defineProperty(exports, "__esModule", ({ value: true })); +-exports.activate = void 0; +-const request_light_1 = __webpack_require__(1); +-const vscode_1 = __webpack_require__(2); +-const fsProvider_1 = __webpack_require__(3); +-const SCHEME = 'vscode-test-web'; +-function activate(context) { +- const serverUri = context.extensionUri.with({ path: '/static/mount', query: undefined }); +- const serverBackedRootDirectory = new ServerBackedDirectory(serverUri, [], ''); +- const disposable = vscode_1.workspace.registerFileSystemProvider(SCHEME, new fsProvider_1.MemFileSystemProvider(SCHEME, serverBackedRootDirectory)); +- context.subscriptions.push(disposable); +- console.log(`vscode-test-web-support fs provider registers for ${SCHEME}, initial content from ${serverUri.toString(/*skipEncoding*/ true)}`); +-} +-exports.activate = activate; +-class ServerBackedFile { +- constructor(_serverRoot, pathSegments, name) { +- this._serverRoot = _serverRoot; +- this.pathSegments = pathSegments; +- this.name = name; +- this.type = vscode_1.FileType.File; +- } +- get stats() { +- if (this._stats === undefined) { +- this._stats = getStats(this._serverRoot, this.pathSegments); +- } +- return this._stats; +- } +- set stats(stats) { +- this._stats = stats; +- } +- get content() { +- if (this._content === undefined) { +- this._content = getContent(this._serverRoot, this.pathSegments); +- } +- return this._content; +- } +- set content(content) { +- this._content = content; +- } +-} +-class ServerBackedDirectory { +- constructor(_serverRoot, pathSegments, name) { +- this._serverRoot = _serverRoot; +- this.pathSegments = pathSegments; +- this.name = name; +- this.type = vscode_1.FileType.Directory; +- } +- get stats() { +- if (this._stats === undefined) { +- this._stats = getStats(this._serverRoot, this.pathSegments); +- } +- return this._stats; +- } +- set stats(stats) { +- this._stats = stats; +- } +- get entries() { +- if (this._entries === undefined) { +- this._entries = getEntries(this._serverRoot, this.pathSegments); +- } +- return this._entries; +- } +- set entries(entries) { +- this._entries = entries; +- } +-} +-// eslint-disable-next-line @typescript-eslint/no-explicit-any +-function isEntry(e) { +- return e && (e.type === vscode_1.FileType.Directory || e.type === vscode_1.FileType.File) && typeof e.name === 'string' && e.name.length > 0; +-} +-// eslint-disable-next-line @typescript-eslint/no-explicit-any +-function isStat(e) { +- return e && (e.type === vscode_1.FileType.Directory || e.type === vscode_1.FileType.File) && typeof e.ctime === 'number' && typeof e.mtime === 'number' && typeof e.size === 'number'; +-} +-function getServerUri(serverRoot, pathSegments) { +- return vscode_1.Uri.joinPath(serverRoot, ...pathSegments); +-} +-async function getEntries(serverRoot, pathSegments) { +- const url = getServerUri(serverRoot, pathSegments).with({ query: 'readdir' }).toString(/*skipEncoding*/ true); +- const response = await (0, request_light_1.xhr)({ url }); +- if (response.status === 200 && response.status <= 204) { +- try { +- const res = JSON.parse(response.responseText); +- if (Array.isArray(res)) { +- const entries = new Map(); +- for (const r of res) { +- if (isEntry(r)) { +- const newPathSegments = [...pathSegments, encodeURIComponent(r.name)]; +- const newEntry = r.type === vscode_1.FileType.Directory ? new ServerBackedDirectory(serverRoot, newPathSegments, r.name) : new ServerBackedFile(serverRoot, newPathSegments, r.name); +- entries.set(newEntry.name, newEntry); +- } +- } +- return entries; +- } +- } +- catch { +- // ignore +- } +- console.log(`Invalid server response format for ${url}.`); +- } +- else { +- console.log(`Invalid server response for ${url}. Status ${response.status}`); +- } +- return new Map(); +-} +-async function getStats(serverRoot, pathSegments) { +- const serverUri = getServerUri(serverRoot, pathSegments); +- const url = serverUri.with({ query: 'stat' }).toString(/*skipEncoding*/ true); +- const response = await (0, request_light_1.xhr)({ url }); +- if (response.status === 200 && response.status <= 204) { +- const res = JSON.parse(response.responseText); +- if (isStat(res)) { +- return res; +- } +- throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}.`); +- } +- throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}. Status ${response.status}.`); +-} +-async function getContent(serverRoot, pathSegments) { +- const serverUri = getServerUri(serverRoot, pathSegments); +- const response = await (0, request_light_1.xhr)({ url: serverUri.toString(/*skipEncoding*/ true) }); +- if (response.status >= 200 && response.status <= 204) { +- return response.body; +- } +- throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}. Status ${response.status}.`); +-} +- +-})(); +- +-var __webpack_export_target__ = exports; +-for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i]; +-if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true }); +-/******/ })() +-; +-//# sourceMappingURL=fsExtensionMain.js.map +\ No newline at end of file ++ (()=>{"use strict";var e={};(()=>{var r=e;Object.defineProperty(r,"__esModule",{value:!0}),r.getErrorStatusDescription=r.xhr=r.configure=void 0,r.configure=(e,r)=>{},r.xhr=async e=>{const r=new Headers;if(e.headers)for(const t in e.headers){const o=e.headers[t];Array.isArray(o)?o.forEach((e=>r.set(t,e))):r.set(t,o)}e.user&&e.password&&r.set("Authorization","Basic "+btoa(e.user+":"+e.password));const t={method:e.type,redirect:e.followRedirects>0?"follow":"manual",mode:"cors",headers:r};if(e.data&&(t.body=e.data),e.token){const r=new AbortController;e.token.isCancellationRequested&&r.abort(),e.token.onCancellationRequested((()=>{r.abort()})),t.signal=r.signal}const o=new Request(e.url,t),s=await fetch(o),a={};s.headers.forEach(((e,r)=>{a[r]=e}));const n=await s.arrayBuffer();return new class{constructor(){this.status=s.status,this.headers=a}get responseText(){return(new TextDecoder).decode(n)}get body(){return new Uint8Array(n)}}},r.getErrorStatusDescription=function(e){return String(e)}})();var r=exports;for(var t in e)r[t]=e[t];e.__esModule&&Object.defineProperty(r,"__esModule",{value:!0})})(); ++ ++ /***/ }), ++ /* 2 */ ++ /***/ ((module) => { ++ ++ "use strict"; ++ module.exports = require("vscode"); ++ ++ /***/ }), ++ /* 3 */ ++ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { ++ ++ "use strict"; ++ ++ /*--------------------------------------------------------------------------------------------- ++ * Copyright (c) Microsoft Corporation. All rights reserved. ++ * Licensed under the MIT License. See License.txt in the project root for license information. ++ *--------------------------------------------------------------------------------------------*/ ++ Object.defineProperty(exports, "__esModule", ({ value: true })); ++ exports.MemFileSystemProvider = void 0; ++ const vscode_1 = __webpack_require__(2); ++ const vscode_uri_1 = __webpack_require__(4); ++ const minimatch_1 = __webpack_require__(6); ++ function newFileStat(type, size) { ++ return Promise.resolve({ type, ctime: Date.now(), mtime: Date.now(), size }); ++ } ++ function modifiedFileStat(stats, size) { ++ return Promise.resolve({ type: stats.type, ctime: stats.ctime, mtime: Date.now(), size: size ?? stats.size }); ++ } ++ class MemFileSystemProvider { ++ constructor(scheme, root, extensionUri) { ++ this.scheme = scheme; ++ this.root = root; ++ this.extensionUri = extensionUri; ++ // --- manage file events ++ this._onDidChangeFile = new vscode_1.EventEmitter(); ++ this.onDidChangeFile = this._onDidChangeFile.event; ++ this._bufferedChanges = []; ++ } ++ // --- manage file metadata ++ async stat(resource) { ++ const entry = await this._lookup(resource, false); ++ return entry.stats; ++ } ++ async readDirectory(resource) { ++ const entry = await this._lookupAsDirectory(resource, false); ++ const entries = await entry.entries; ++ const result = []; ++ entries.forEach((child, name) => result.push([name, child.type])); ++ return result; ++ } ++ // --- manage file contents ++ async readFile(resource) { ++ const entry = await this._lookupAsFile(resource, false); ++ return entry.content; ++ } ++ async writeFile(uri, content, opts) { ++ const basename = vscode_uri_1.Utils.basename(uri); ++ const parent = await this._lookupParentDirectory(uri); ++ const entries = await parent.entries; ++ let entry = entries.get(basename); ++ if (entry && entry.type === vscode_1.FileType.Directory) { ++ throw vscode_1.FileSystemError.FileIsADirectory(uri); ++ } ++ if (!entry && !opts.create) { ++ throw vscode_1.FileSystemError.FileNotFound(uri); ++ } ++ if (entry && opts.create && !opts.overwrite) { ++ throw vscode_1.FileSystemError.FileExists(uri); ++ } ++ const stats = newFileStat(vscode_1.FileType.File, content.byteLength); ++ if (!entry) { ++ entry = { type: vscode_1.FileType.File, name: basename, stats, content: Promise.resolve(content) }; ++ entries.set(basename, entry); ++ this._fireSoon({ type: vscode_1.FileChangeType.Created, uri }); ++ } ++ else { ++ entry.stats = stats; ++ entry.content = Promise.resolve(content); ++ } ++ this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri }); ++ } ++ // --- manage files/folders ++ async rename(from, to, opts) { ++ if (!opts.overwrite && await this._lookup(to, true)) { ++ throw vscode_1.FileSystemError.FileExists(to); ++ } ++ const entry = await this._lookup(from, false); ++ const oldParent = await this._lookupParentDirectory(from); ++ const newParent = await this._lookupParentDirectory(to); ++ const newName = vscode_uri_1.Utils.basename(to); ++ const oldParentEntries = await oldParent.entries; ++ oldParentEntries.delete(entry.name); ++ entry.name = newName; ++ const newParentEntries = await newParent.entries; ++ newParentEntries.set(newName, entry); ++ this._fireSoon({ type: vscode_1.FileChangeType.Deleted, uri: from }, { type: vscode_1.FileChangeType.Created, uri: to }); ++ } ++ async delete(uri, opts) { ++ const dirname = vscode_uri_1.Utils.dirname(uri); ++ const basename = vscode_uri_1.Utils.basename(uri); ++ const parent = await this._lookupAsDirectory(dirname, false); ++ const parentEntries = await parent.entries; ++ if (parentEntries.has(basename)) { ++ parentEntries.delete(basename); ++ parent.stats = newFileStat(parent.type, -1); ++ this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri: dirname }, { uri, type: vscode_1.FileChangeType.Deleted }); ++ } ++ } ++ async createDirectory(uri) { ++ const basename = vscode_uri_1.Utils.basename(uri); ++ const dirname = vscode_uri_1.Utils.dirname(uri); ++ const parent = await this._lookupAsDirectory(dirname, false); ++ const parentEntries = await parent.entries; ++ const entry = { type: vscode_1.FileType.Directory, name: basename, stats: newFileStat(vscode_1.FileType.Directory, 0), entries: Promise.resolve(new Map()) }; ++ parentEntries.set(entry.name, entry); ++ const stats = await parent.stats; ++ parent.stats = modifiedFileStat(stats, stats.size + 1); ++ this._fireSoon({ type: vscode_1.FileChangeType.Changed, uri: dirname }, { type: vscode_1.FileChangeType.Created, uri }); ++ } ++ // --- search ++ provideFileSearchResults(query, options, token) { ++ const pattern = query.pattern; ++ // Pattern is always blank: https://github.com/microsoft/vscode/issues/200892 ++ console.log(`vscode-test-web search query: ${JSON.stringify(query)}`); ++ const glob = new minimatch_1.Minimatch(pattern); ++ const result = []; ++ const dive = async (currentDirectory, pathSegments = []) => { ++ for (const [name, entry] of await currentDirectory.entries) { ++ if (typeof options.maxResults !== 'undefined' && result.length >= options.maxResults) { ++ break; ++ } ++ const uri = vscode_1.Uri.joinPath(this.extensionUri, ...pathSegments, entry.name); ++ if (entry.type === vscode_1.FileType.File) { ++ const toMatch = uri.toString(); ++ // Pattern is always blank: https://github.com/microsoft/vscode/issues/200892 ++ if (!pattern || glob.match(toMatch)) { ++ result.push(uri); ++ } ++ } ++ else if (entry.type === vscode_1.FileType.Directory) { ++ await dive(entry, [...pathSegments, name]); ++ } ++ } ++ }; ++ return dive(this.root).then(() => { ++ return result; ++ }); ++ } ++ async _lookup(uri, silent) { ++ if (uri.scheme !== this.scheme) { ++ if (!silent) { ++ throw vscode_1.FileSystemError.FileNotFound(uri); ++ } ++ else { ++ return undefined; ++ } ++ } ++ let entry = this.root; ++ const parts = uri.path.split('/'); ++ for (const part of parts) { ++ if (!part) { ++ continue; ++ } ++ let child; ++ if (entry.type === vscode_1.FileType.Directory) { ++ child = (await entry.entries).get(part); ++ } ++ if (!child) { ++ if (!silent) { ++ throw vscode_1.FileSystemError.FileNotFound(uri); ++ } ++ else { ++ return undefined; ++ } ++ } ++ entry = child; ++ } ++ return entry; ++ } ++ async _lookupAsDirectory(uri, silent) { ++ const entry = await this._lookup(uri, silent); ++ if (entry?.type === vscode_1.FileType.Directory) { ++ return entry; ++ } ++ throw vscode_1.FileSystemError.FileNotADirectory(uri); ++ } ++ async _lookupAsFile(uri, silent) { ++ const entry = await this._lookup(uri, silent); ++ if (!entry) { ++ throw vscode_1.FileSystemError.FileNotFound(uri); ++ } ++ if (entry.type === vscode_1.FileType.File) { ++ return entry; ++ } ++ throw vscode_1.FileSystemError.FileIsADirectory(uri); ++ } ++ _lookupParentDirectory(uri) { ++ const dirname = vscode_uri_1.Utils.dirname(uri); ++ return this._lookupAsDirectory(dirname, false); ++ } ++ watch(resource, opts) { ++ // ignore, fires for all changes... ++ return vscode_1.Disposable.from(); ++ } ++ _fireSoon(...changes) { ++ this._bufferedChanges.push(...changes); ++ if (this._fireSoonHandle) { ++ clearTimeout(this._fireSoonHandle); ++ } ++ this._fireSoonHandle = setTimeout(() => { ++ this._onDidChangeFile.fire(this._bufferedChanges); ++ this._bufferedChanges.length = 0; ++ }, 5); ++ } ++ dispose() { ++ this._onDidChangeFile.dispose(); ++ } ++ } ++ exports.MemFileSystemProvider = MemFileSystemProvider; ++ ++ ++ /***/ }), ++ /* 4 */ ++ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { ++ ++ /* provided dependency */ var process = __webpack_require__(5); ++ !function(t,e){if(true)module.exports=e();else { var n, r; }}(this,(()=>(()=>{"use strict";var t={470:t=>{function e(t){if("string"!=typeof t)throw new TypeError("Path must be a string. Received "+JSON.stringify(t))}function r(t,e){for(var r,n="",i=0,o=-1,s=0,a=0;a<=t.length;++a){if(a2){var h=n.lastIndexOf("/");if(h!==n.length-1){-1===h?(n="",i=0):i=(n=n.slice(0,h)).length-1-n.lastIndexOf("/"),o=a,s=0;continue}}else if(2===n.length||1===n.length){n="",i=0,o=a,s=0;continue}e&&(n.length>0?n+="/..":n="..",i=2)}else n.length>0?n+="/"+t.slice(o+1,a):n=t.slice(o+1,a),i=a-o-1;o=a,s=0}else 46===r&&-1!==s?++s:s=-1}return n}var n={resolve:function(){for(var t,n="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var s;o>=0?s=arguments[o]:(void 0===t&&(t=process.cwd()),s=t),e(s),0!==s.length&&(n=s+"/"+n,i=47===s.charCodeAt(0))}return n=r(n,!i),i?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize:function(t){if(e(t),0===t.length)return".";var n=47===t.charCodeAt(0),i=47===t.charCodeAt(t.length-1);return 0!==(t=r(t,!n)).length||n||(t="."),t.length>0&&i&&(t+="/"),n?"/"+t:t},isAbsolute:function(t){return e(t),t.length>0&&47===t.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var t,r=0;r0&&(void 0===t?t=i:t+="/"+i)}return void 0===t?".":n.normalize(t)},relative:function(t,r){if(e(t),e(r),t===r)return"";if((t=n.resolve(t))===(r=n.resolve(r)))return"";for(var i=1;ic){if(47===r.charCodeAt(a+u))return r.slice(a+u+1);if(0===u)return r.slice(a+u)}else s>c&&(47===t.charCodeAt(i+u)?f=u:0===u&&(f=0));break}var l=t.charCodeAt(i+u);if(l!==r.charCodeAt(a+u))break;47===l&&(f=u)}var d="";for(u=i+f+1;u<=o;++u)u!==o&&47!==t.charCodeAt(u)||(0===d.length?d+="..":d+="/..");return d.length>0?d+r.slice(a+f):(a+=f,47===r.charCodeAt(a)&&++a,r.slice(a))},_makeLong:function(t){return t},dirname:function(t){if(e(t),0===t.length)return".";for(var r=t.charCodeAt(0),n=47===r,i=-1,o=!0,s=t.length-1;s>=1;--s)if(47===(r=t.charCodeAt(s))){if(!o){i=s;break}}else o=!1;return-1===i?n?"/":".":n&&1===i?"//":t.slice(0,i)},basename:function(t,r){if(void 0!==r&&"string"!=typeof r)throw new TypeError('"ext" argument must be a string');e(t);var n,i=0,o=-1,s=!0;if(void 0!==r&&r.length>0&&r.length<=t.length){if(r.length===t.length&&r===t)return"";var a=r.length-1,h=-1;for(n=t.length-1;n>=0;--n){var c=t.charCodeAt(n);if(47===c){if(!s){i=n+1;break}}else-1===h&&(s=!1,h=n+1),a>=0&&(c===r.charCodeAt(a)?-1==--a&&(o=n):(a=-1,o=h))}return i===o?o=h:-1===o&&(o=t.length),t.slice(i,o)}for(n=t.length-1;n>=0;--n)if(47===t.charCodeAt(n)){if(!s){i=n+1;break}}else-1===o&&(s=!1,o=n+1);return-1===o?"":t.slice(i,o)},extname:function(t){e(t);for(var r=-1,n=0,i=-1,o=!0,s=0,a=t.length-1;a>=0;--a){var h=t.charCodeAt(a);if(47!==h)-1===i&&(o=!1,i=a+1),46===h?-1===r?r=a:1!==s&&(s=1):-1!==r&&(s=-1);else if(!o){n=a+1;break}}return-1===r||-1===i||0===s||1===s&&r===i-1&&r===n+1?"":t.slice(r,i)},format:function(t){if(null===t||"object"!=typeof t)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof t);return function(t,e){var r=e.dir||e.root,n=e.base||(e.name||"")+(e.ext||"");return r?r===e.root?r+n:r+"/"+n:n}(0,t)},parse:function(t){e(t);var r={root:"",dir:"",base:"",ext:"",name:""};if(0===t.length)return r;var n,i=t.charCodeAt(0),o=47===i;o?(r.root="/",n=1):n=0;for(var s=-1,a=0,h=-1,c=!0,f=t.length-1,u=0;f>=n;--f)if(47!==(i=t.charCodeAt(f)))-1===h&&(c=!1,h=f+1),46===i?-1===s?s=f:1!==u&&(u=1):-1!==s&&(u=-1);else if(!c){a=f+1;break}return-1===s||-1===h||0===u||1===u&&s===h-1&&s===a+1?-1!==h&&(r.base=r.name=0===a&&o?t.slice(1,h):t.slice(a,h)):(0===a&&o?(r.name=t.slice(1,s),r.base=t.slice(1,h)):(r.name=t.slice(a,s),r.base=t.slice(a,h)),r.ext=t.slice(s,h)),a>0?r.dir=t.slice(0,a-1):o&&(r.dir="/"),r},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,t.exports=n},674:(t,e)=>{if(Object.defineProperty(e,"__esModule",{value:!0}),e.isWindows=void 0,"object"==typeof process)e.isWindows="win32"===process.platform;else if("object"==typeof navigator){let t=navigator.userAgent;e.isWindows=t.indexOf("Windows")>=0}},796:(t,e,r)=>{Object.defineProperty(e,"__esModule",{value:!0}),e.uriToFsPath=e.URI=void 0;const n=r(674),i=/^\w[\w\d+.-]*$/,o=/^\//,s=/^\/\//;function a(t,e){if(!t.scheme&&e)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${t.authority}", path: "${t.path}", query: "${t.query}", fragment: "${t.fragment}"}`);if(t.scheme&&!i.test(t.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(t.path)if(t.authority){if(!o.test(t.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(s.test(t.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}const h="",c="/",f=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class u{static isUri(t){return t instanceof u||!!t&&"string"==typeof t.authority&&"string"==typeof t.fragment&&"string"==typeof t.path&&"string"==typeof t.query&&"string"==typeof t.scheme&&"string"==typeof t.fsPath&&"function"==typeof t.with&&"function"==typeof t.toString}scheme;authority;path;query;fragment;constructor(t,e,r,n,i,o=!1){"object"==typeof t?(this.scheme=t.scheme||h,this.authority=t.authority||h,this.path=t.path||h,this.query=t.query||h,this.fragment=t.fragment||h):(this.scheme=function(t,e){return t||e?t:"file"}(t,o),this.authority=e||h,this.path=function(t,e){switch(t){case"https":case"http":case"file":e?e[0]!==c&&(e=c+e):e=c}return e}(this.scheme,r||h),this.query=n||h,this.fragment=i||h,a(this,o))}get fsPath(){return v(this,!1)}with(t){if(!t)return this;let{scheme:e,authority:r,path:n,query:i,fragment:o}=t;return void 0===e?e=this.scheme:null===e&&(e=h),void 0===r?r=this.authority:null===r&&(r=h),void 0===n?n=this.path:null===n&&(n=h),void 0===i?i=this.query:null===i&&(i=h),void 0===o?o=this.fragment:null===o&&(o=h),e===this.scheme&&r===this.authority&&n===this.path&&i===this.query&&o===this.fragment?this:new d(e,r,n,i,o)}static parse(t,e=!1){const r=f.exec(t);return r?new d(r[2]||h,w(r[4]||h),w(r[5]||h),w(r[7]||h),w(r[9]||h),e):new d(h,h,h,h,h)}static file(t){let e=h;if(n.isWindows&&(t=t.replace(/\\/g,c)),t[0]===c&&t[1]===c){const r=t.indexOf(c,2);-1===r?(e=t.substring(2),t=c):(e=t.substring(2,r),t=t.substring(r)||c)}return new d("file",e,t,h,h)}static from(t){const e=new d(t.scheme,t.authority,t.path,t.query,t.fragment);return a(e,!0),e}toString(t=!1){return y(this,t)}toJSON(){return this}static revive(t){if(t){if(t instanceof u)return t;{const e=new d(t);return e._formatted=t.external,e._fsPath=t._sep===l?t.fsPath:null,e}}return t}}e.URI=u;const l=n.isWindows?1:void 0;class d extends u{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=v(this,!1)),this._fsPath}toString(t=!1){return t?y(this,!0):(this._formatted||(this._formatted=y(this,!1)),this._formatted)}toJSON(){const t={$mid:1};return this._fsPath&&(t.fsPath=this._fsPath,t._sep=l),this._formatted&&(t.external=this._formatted),this.path&&(t.path=this.path),this.scheme&&(t.scheme=this.scheme),this.authority&&(t.authority=this.authority),this.query&&(t.query=this.query),this.fragment&&(t.fragment=this.fragment),t}}const p={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function g(t,e,r){let n,i=-1;for(let o=0;o=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57||45===s||46===s||95===s||126===s||e&&47===s||r&&91===s||r&&93===s||r&&58===s)-1!==i&&(n+=encodeURIComponent(t.substring(i,o)),i=-1),void 0!==n&&(n+=t.charAt(o));else{void 0===n&&(n=t.substr(0,o));const e=p[s];void 0!==e?(-1!==i&&(n+=encodeURIComponent(t.substring(i,o)),i=-1),n+=e):-1===i&&(i=o)}}return-1!==i&&(n+=encodeURIComponent(t.substring(i))),void 0!==n?n:t}function m(t){let e;for(let r=0;r1&&"file"===t.scheme?`//${t.authority}${t.path}`:47===t.path.charCodeAt(0)&&(t.path.charCodeAt(1)>=65&&t.path.charCodeAt(1)<=90||t.path.charCodeAt(1)>=97&&t.path.charCodeAt(1)<=122)&&58===t.path.charCodeAt(2)?e?t.path.substr(1):t.path[1].toLowerCase()+t.path.substr(2):t.path,n.isWindows&&(r=r.replace(/\//g,"\\")),r}function y(t,e){const r=e?m:g;let n="",{scheme:i,authority:o,path:s,query:a,fragment:h}=t;if(i&&(n+=i,n+=":"),(o||"file"===i)&&(n+=c,n+=c),o){let t=o.indexOf("@");if(-1!==t){const e=o.substr(0,t);o=o.substr(t+1),t=e.lastIndexOf(":"),-1===t?n+=r(e,!1,!1):(n+=r(e.substr(0,t),!1,!1),n+=":",n+=r(e.substr(t+1),!1,!0)),n+="@"}o=o.toLowerCase(),t=o.lastIndexOf(":"),-1===t?n+=r(o,!1,!0):(n+=r(o.substr(0,t),!1,!0),n+=o.substr(t))}if(s){if(s.length>=3&&47===s.charCodeAt(0)&&58===s.charCodeAt(2)){const t=s.charCodeAt(1);t>=65&&t<=90&&(s=`/${String.fromCharCode(t+32)}:${s.substr(3)}`)}else if(s.length>=2&&58===s.charCodeAt(1)){const t=s.charCodeAt(0);t>=65&&t<=90&&(s=`${String.fromCharCode(t+32)}:${s.substr(2)}`)}n+=r(s,!0,!1)}return a&&(n+="?",n+=r(a,!1,!1)),h&&(n+="#",n+=e?h:g(h,!1,!1)),n}function b(t){try{return decodeURIComponent(t)}catch{return t.length>3?t.substr(0,3)+b(t.substr(3)):t}}e.uriToFsPath=v;const C=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function w(t){return t.match(C)?t.replace(C,(t=>b(t))):t}},679:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(e,r);i&&!("get"in i?!e.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,i)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),o=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return i(e,t),e};Object.defineProperty(e,"__esModule",{value:!0}),e.Utils=void 0;const s=o(r(470)),a=s.posix||s,h="/";var c;!function(t){t.joinPath=function(t,...e){return t.with({path:a.join(t.path,...e)})},t.resolvePath=function(t,...e){let r=t.path,n=!1;r[0]!==h&&(r=h+r,n=!0);let i=a.resolve(r,...e);return n&&i[0]===h&&!t.authority&&(i=i.substring(1)),t.with({path:i})},t.dirname=function(t){if(0===t.path.length||t.path===h)return t;let e=a.dirname(t.path);return 1===e.length&&46===e.charCodeAt(0)&&(e=""),t.with({path:e})},t.basename=function(t){return a.basename(t.path)},t.extname=function(t){return a.extname(t.path)}}(c||(e.Utils=c={}))}},e={};function r(n){var i=e[n];if(void 0!==i)return i.exports;var o=e[n]={exports:{}};return t[n].call(o.exports,o,o.exports,r),o.exports}var n={};return(()=>{var t=n;Object.defineProperty(t,"__esModule",{value:!0}),t.Utils=t.URI=void 0;const e=r(796);Object.defineProperty(t,"URI",{enumerable:!0,get:function(){return e.URI}});const i=r(679);Object.defineProperty(t,"Utils",{enumerable:!0,get:function(){return i.Utils}})})(),n})())); ++ //# sourceMappingURL=index.js.map ++ ++ /***/ }), ++ /* 5 */ ++ /***/ ((module) => { ++ ++ // shim for using process in browser ++ var process = module.exports = {}; ++ ++ // cached from whatever global is present so that test runners that stub it ++ // don't break things. But we need to wrap it in a try catch in case it is ++ // wrapped in strict mode code which doesn't define any globals. It's inside a ++ // function because try/catches deoptimize in certain engines. ++ ++ var cachedSetTimeout; ++ var cachedClearTimeout; ++ ++ function defaultSetTimout() { ++ throw new Error('setTimeout has not been defined'); ++ } ++ function defaultClearTimeout () { ++ throw new Error('clearTimeout has not been defined'); ++ } ++ (function () { ++ try { ++ if (typeof setTimeout === 'function') { ++ cachedSetTimeout = setTimeout; ++ } else { ++ cachedSetTimeout = defaultSetTimout; ++ } ++ } catch (e) { ++ cachedSetTimeout = defaultSetTimout; ++ } ++ try { ++ if (typeof clearTimeout === 'function') { ++ cachedClearTimeout = clearTimeout; ++ } else { ++ cachedClearTimeout = defaultClearTimeout; ++ } ++ } catch (e) { ++ cachedClearTimeout = defaultClearTimeout; ++ } ++ } ()) ++ function runTimeout(fun) { ++ if (cachedSetTimeout === setTimeout) { ++ //normal enviroments in sane situations ++ return setTimeout(fun, 0); ++ } ++ // if setTimeout wasn't available but was latter defined ++ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { ++ cachedSetTimeout = setTimeout; ++ return setTimeout(fun, 0); ++ } ++ try { ++ // when when somebody has screwed with setTimeout but no I.E. maddness ++ return cachedSetTimeout(fun, 0); ++ } catch(e){ ++ try { ++ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally ++ return cachedSetTimeout.call(null, fun, 0); ++ } catch(e){ ++ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error ++ return cachedSetTimeout.call(this, fun, 0); ++ } ++ } ++ ++ ++ } ++ function runClearTimeout(marker) { ++ if (cachedClearTimeout === clearTimeout) { ++ //normal enviroments in sane situations ++ return clearTimeout(marker); ++ } ++ // if clearTimeout wasn't available but was latter defined ++ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { ++ cachedClearTimeout = clearTimeout; ++ return clearTimeout(marker); ++ } ++ try { ++ // when when somebody has screwed with setTimeout but no I.E. maddness ++ return cachedClearTimeout(marker); ++ } catch (e){ ++ try { ++ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally ++ return cachedClearTimeout.call(null, marker); ++ } catch (e){ ++ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. ++ // Some versions of I.E. have different rules for clearTimeout vs setTimeout ++ return cachedClearTimeout.call(this, marker); ++ } ++ } ++ ++ ++ ++ } ++ var queue = []; ++ var draining = false; ++ var currentQueue; ++ var queueIndex = -1; ++ ++ function cleanUpNextTick() { ++ if (!draining || !currentQueue) { ++ return; ++ } ++ draining = false; ++ if (currentQueue.length) { ++ queue = currentQueue.concat(queue); ++ } else { ++ queueIndex = -1; ++ } ++ if (queue.length) { ++ drainQueue(); ++ } ++ } ++ ++ function drainQueue() { ++ if (draining) { ++ return; ++ } ++ var timeout = runTimeout(cleanUpNextTick); ++ draining = true; ++ ++ var len = queue.length; ++ while(len) { ++ currentQueue = queue; ++ queue = []; ++ while (++queueIndex < len) { ++ if (currentQueue) { ++ currentQueue[queueIndex].run(); ++ } ++ } ++ queueIndex = -1; ++ len = queue.length; ++ } ++ currentQueue = null; ++ draining = false; ++ runClearTimeout(timeout); ++ } ++ ++ process.nextTick = function (fun) { ++ var args = new Array(arguments.length - 1); ++ if (arguments.length > 1) { ++ for (var i = 1; i < arguments.length; i++) { ++ args[i - 1] = arguments[i]; ++ } ++ } ++ queue.push(new Item(fun, args)); ++ if (queue.length === 1 && !draining) { ++ runTimeout(drainQueue); ++ } ++ }; ++ ++ // v8 likes predictible objects ++ function Item(fun, array) { ++ this.fun = fun; ++ this.array = array; ++ } ++ Item.prototype.run = function () { ++ this.fun.apply(null, this.array); ++ }; ++ process.title = 'browser'; ++ process.browser = true; ++ process.env = {}; ++ process.argv = []; ++ process.version = ''; // empty string to avoid regexp issues ++ process.versions = {}; ++ ++ function noop() {} ++ ++ process.on = noop; ++ process.addListener = noop; ++ process.once = noop; ++ process.off = noop; ++ process.removeListener = noop; ++ process.removeAllListeners = noop; ++ process.emit = noop; ++ process.prependListener = noop; ++ process.prependOnceListener = noop; ++ ++ process.listeners = function (name) { return [] } ++ ++ process.binding = function (name) { ++ throw new Error('process.binding is not supported'); ++ }; ++ ++ process.cwd = function () { return '/' }; ++ process.chdir = function (dir) { ++ throw new Error('process.chdir is not supported'); ++ }; ++ process.umask = function() { return 0; }; ++ ++ ++ /***/ }), ++ /* 6 */ ++ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { ++ ++ "use strict"; ++ /* provided dependency */ var process = __webpack_require__(5); ++ ++ var __importDefault = (this && this.__importDefault) || function (mod) { ++ return (mod && mod.__esModule) ? mod : { "default": mod }; ++ }; ++ Object.defineProperty(exports, "__esModule", ({ value: true })); ++ exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0; ++ const brace_expansion_1 = __importDefault(__webpack_require__(7)); ++ const assert_valid_pattern_js_1 = __webpack_require__(9); ++ const ast_js_1 = __webpack_require__(10); ++ const escape_js_1 = __webpack_require__(13); ++ const unescape_js_1 = __webpack_require__(12); ++ const minimatch = (p, pattern, options = {}) => { ++ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); ++ // shortcut: comments match nothing. ++ if (!options.nocomment && pattern.charAt(0) === '#') { ++ return false; ++ } ++ return new Minimatch(pattern, options).match(p); ++ }; ++ exports.minimatch = minimatch; ++ // Optimized checking for the most common glob patterns. ++ const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/; ++ const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext); ++ const starDotExtTestDot = (ext) => (f) => f.endsWith(ext); ++ const starDotExtTestNocase = (ext) => { ++ ext = ext.toLowerCase(); ++ return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext); ++ }; ++ const starDotExtTestNocaseDot = (ext) => { ++ ext = ext.toLowerCase(); ++ return (f) => f.toLowerCase().endsWith(ext); ++ }; ++ const starDotStarRE = /^\*+\.\*+$/; ++ const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.'); ++ const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.'); ++ const dotStarRE = /^\.\*+$/; ++ const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.'); ++ const starRE = /^\*+$/; ++ const starTest = (f) => f.length !== 0 && !f.startsWith('.'); ++ const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..'; ++ const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/; ++ const qmarksTestNocase = ([$0, ext = '']) => { ++ const noext = qmarksTestNoExt([$0]); ++ if (!ext) ++ return noext; ++ ext = ext.toLowerCase(); ++ return (f) => noext(f) && f.toLowerCase().endsWith(ext); ++ }; ++ const qmarksTestNocaseDot = ([$0, ext = '']) => { ++ const noext = qmarksTestNoExtDot([$0]); ++ if (!ext) ++ return noext; ++ ext = ext.toLowerCase(); ++ return (f) => noext(f) && f.toLowerCase().endsWith(ext); ++ }; ++ const qmarksTestDot = ([$0, ext = '']) => { ++ const noext = qmarksTestNoExtDot([$0]); ++ return !ext ? noext : (f) => noext(f) && f.endsWith(ext); ++ }; ++ const qmarksTest = ([$0, ext = '']) => { ++ const noext = qmarksTestNoExt([$0]); ++ return !ext ? noext : (f) => noext(f) && f.endsWith(ext); ++ }; ++ const qmarksTestNoExt = ([$0]) => { ++ const len = $0.length; ++ return (f) => f.length === len && !f.startsWith('.'); ++ }; ++ const qmarksTestNoExtDot = ([$0]) => { ++ const len = $0.length; ++ return (f) => f.length === len && f !== '.' && f !== '..'; ++ }; ++ /* c8 ignore start */ ++ const defaultPlatform = (typeof process === 'object' && process ++ ? (typeof process.env === 'object' && ++ process.env && ++ process.env.__MINIMATCH_TESTING_PLATFORM__) || ++ process.platform ++ : 'posix'); ++ const path = { ++ win32: { sep: '\\' }, ++ posix: { sep: '/' }, ++ }; ++ /* c8 ignore stop */ ++ exports.sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep; ++ exports.minimatch.sep = exports.sep; ++ exports.GLOBSTAR = Symbol('globstar **'); ++ exports.minimatch.GLOBSTAR = exports.GLOBSTAR; ++ // any single thing other than / ++ // don't need to escape / when using new RegExp() ++ const qmark = '[^/]'; ++ // * => any number of characters ++ const star = qmark + '*?'; ++ // ** when dots are allowed. Anything goes, except .. and . ++ // not (^ or / followed by one or two dots followed by $ or /), ++ // followed by anything, any number of times. ++ const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?'; ++ // not a ^ or / followed by a dot, ++ // followed by anything, any number of times. ++ const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?'; ++ const filter = (pattern, options = {}) => (p) => (0, exports.minimatch)(p, pattern, options); ++ exports.filter = filter; ++ exports.minimatch.filter = exports.filter; ++ const ext = (a, b = {}) => Object.assign({}, a, b); ++ const defaults = (def) => { ++ if (!def || typeof def !== 'object' || !Object.keys(def).length) { ++ return exports.minimatch; ++ } ++ const orig = exports.minimatch; ++ const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options)); ++ return Object.assign(m, { ++ Minimatch: class Minimatch extends orig.Minimatch { ++ constructor(pattern, options = {}) { ++ super(pattern, ext(def, options)); ++ } ++ static defaults(options) { ++ return orig.defaults(ext(def, options)).Minimatch; ++ } ++ }, ++ AST: class AST extends orig.AST { ++ /* c8 ignore start */ ++ constructor(type, parent, options = {}) { ++ super(type, parent, ext(def, options)); ++ } ++ /* c8 ignore stop */ ++ static fromGlob(pattern, options = {}) { ++ return orig.AST.fromGlob(pattern, ext(def, options)); ++ } ++ }, ++ unescape: (s, options = {}) => orig.unescape(s, ext(def, options)), ++ escape: (s, options = {}) => orig.escape(s, ext(def, options)), ++ filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)), ++ defaults: (options) => orig.defaults(ext(def, options)), ++ makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)), ++ braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)), ++ match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)), ++ sep: orig.sep, ++ GLOBSTAR: exports.GLOBSTAR, ++ }); ++ }; ++ exports.defaults = defaults; ++ exports.minimatch.defaults = exports.defaults; ++ // Brace expansion: ++ // a{b,c}d -> abd acd ++ // a{b,}c -> abc ac ++ // a{0..3}d -> a0d a1d a2d a3d ++ // a{b,c{d,e}f}g -> abg acdfg acefg ++ // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg ++ // ++ // Invalid sets are not expanded. ++ // a{2..}b -> a{2..}b ++ // a{b}c -> a{b}c ++ const braceExpand = (pattern, options = {}) => { ++ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); ++ // Thanks to Yeting Li for ++ // improving this regexp to avoid a ReDOS vulnerability. ++ if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) { ++ // shortcut. no need to expand. ++ return [pattern]; ++ } ++ return (0, brace_expansion_1.default)(pattern); ++ }; ++ exports.braceExpand = braceExpand; ++ exports.minimatch.braceExpand = exports.braceExpand; ++ // parse a component of the expanded set. ++ // At this point, no pattern may contain "/" in it ++ // so we're going to return a 2d array, where each entry is the full ++ // pattern, split on '/', and then turned into a regular expression. ++ // A regexp is made at the end which joins each array with an ++ // escaped /, and another full one which joins each regexp with |. ++ // ++ // Following the lead of Bash 4.1, note that "**" only has special meaning ++ // when it is the *only* thing in a path portion. Otherwise, any series ++ // of * is equivalent to a single *. Globstar behavior is enabled by ++ // default, and can be disabled by setting options.noglobstar. ++ const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe(); ++ exports.makeRe = makeRe; ++ exports.minimatch.makeRe = exports.makeRe; ++ const match = (list, pattern, options = {}) => { ++ const mm = new Minimatch(pattern, options); ++ list = list.filter(f => mm.match(f)); ++ if (mm.options.nonull && !list.length) { ++ list.push(pattern); ++ } ++ return list; ++ }; ++ exports.match = match; ++ exports.minimatch.match = exports.match; ++ // replace stuff like \* with * ++ const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/; ++ const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); ++ class Minimatch { ++ options; ++ set; ++ pattern; ++ windowsPathsNoEscape; ++ nonegate; ++ negate; ++ comment; ++ empty; ++ preserveMultipleSlashes; ++ partial; ++ globSet; ++ globParts; ++ nocase; ++ isWindows; ++ platform; ++ windowsNoMagicRoot; ++ regexp; ++ constructor(pattern, options = {}) { ++ (0, assert_valid_pattern_js_1.assertValidPattern)(pattern); ++ options = options || {}; ++ this.options = options; ++ this.pattern = pattern; ++ this.platform = options.platform || defaultPlatform; ++ this.isWindows = this.platform === 'win32'; ++ this.windowsPathsNoEscape = ++ !!options.windowsPathsNoEscape || options.allowWindowsEscape === false; ++ if (this.windowsPathsNoEscape) { ++ this.pattern = this.pattern.replace(/\\/g, '/'); ++ } ++ this.preserveMultipleSlashes = !!options.preserveMultipleSlashes; ++ this.regexp = null; ++ this.negate = false; ++ this.nonegate = !!options.nonegate; ++ this.comment = false; ++ this.empty = false; ++ this.partial = !!options.partial; ++ this.nocase = !!this.options.nocase; ++ this.windowsNoMagicRoot = ++ options.windowsNoMagicRoot !== undefined ++ ? options.windowsNoMagicRoot ++ : !!(this.isWindows && this.nocase); ++ this.globSet = []; ++ this.globParts = []; ++ this.set = []; ++ // make the set of regexps etc. ++ this.make(); ++ } ++ hasMagic() { ++ if (this.options.magicalBraces && this.set.length > 1) { ++ return true; ++ } ++ for (const pattern of this.set) { ++ for (const part of pattern) { ++ if (typeof part !== 'string') ++ return true; ++ } ++ } ++ return false; ++ } ++ debug(..._) { } ++ make() { ++ const pattern = this.pattern; ++ const options = this.options; ++ // empty patterns and comments match nothing. ++ if (!options.nocomment && pattern.charAt(0) === '#') { ++ this.comment = true; ++ return; ++ } ++ if (!pattern) { ++ this.empty = true; ++ return; ++ } ++ // step 1: figure out negation, etc. ++ this.parseNegate(); ++ // step 2: expand braces ++ this.globSet = [...new Set(this.braceExpand())]; ++ if (options.debug) { ++ this.debug = (...args) => console.error(...args); ++ } ++ this.debug(this.pattern, this.globSet); ++ // step 3: now we have a set, so turn each one into a series of ++ // path-portion matching patterns. ++ // These will be regexps, except in the case of "**", which is ++ // set to the GLOBSTAR object for globstar behavior, ++ // and will not contain any / characters ++ // ++ // First, we preprocess to make the glob pattern sets a bit simpler ++ // and deduped. There are some perf-killing patterns that can cause ++ // problems with a glob walk, but we can simplify them down a bit. ++ const rawGlobParts = this.globSet.map(s => this.slashSplit(s)); ++ this.globParts = this.preprocess(rawGlobParts); ++ this.debug(this.pattern, this.globParts); ++ // glob --> regexps ++ let set = this.globParts.map((s, _, __) => { ++ if (this.isWindows && this.windowsNoMagicRoot) { ++ // check if it's a drive or unc path. ++ const isUNC = s[0] === '' && ++ s[1] === '' && ++ (s[2] === '?' || !globMagic.test(s[2])) && ++ !globMagic.test(s[3]); ++ const isDrive = /^[a-z]:/i.test(s[0]); ++ if (isUNC) { ++ return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; ++ } ++ else if (isDrive) { ++ return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; ++ } ++ } ++ return s.map(ss => this.parse(ss)); ++ }); ++ this.debug(this.pattern, set); ++ // filter out everything that didn't compile properly. ++ this.set = set.filter(s => s.indexOf(false) === -1); ++ // do not treat the ? in UNC paths as magic ++ if (this.isWindows) { ++ for (let i = 0; i < this.set.length; i++) { ++ const p = this.set[i]; ++ if (p[0] === '' && ++ p[1] === '' && ++ this.globParts[i][2] === '?' && ++ typeof p[3] === 'string' && ++ /^[a-z]:$/i.test(p[3])) { ++ p[2] = '?'; ++ } ++ } ++ } ++ this.debug(this.pattern, this.set); ++ } ++ // various transforms to equivalent pattern sets that are ++ // faster to process in a filesystem walk. The goal is to ++ // eliminate what we can, and push all ** patterns as far ++ // to the right as possible, even if it increases the number ++ // of patterns that we have to process. ++ preprocess(globParts) { ++ // if we're not in globstar mode, then turn all ** into * ++ if (this.options.noglobstar) { ++ for (let i = 0; i < globParts.length; i++) { ++ for (let j = 0; j < globParts[i].length; j++) { ++ if (globParts[i][j] === '**') { ++ globParts[i][j] = '*'; ++ } ++ } ++ } ++ } ++ const { optimizationLevel = 1 } = this.options; ++ if (optimizationLevel >= 2) { ++ // aggressive optimization for the purpose of fs walking ++ globParts = this.firstPhasePreProcess(globParts); ++ globParts = this.secondPhasePreProcess(globParts); ++ } ++ else if (optimizationLevel >= 1) { ++ // just basic optimizations to remove some .. parts ++ globParts = this.levelOneOptimize(globParts); ++ } ++ else { ++ globParts = this.adjascentGlobstarOptimize(globParts); ++ } ++ return globParts; ++ } ++ // just get rid of adjascent ** portions ++ adjascentGlobstarOptimize(globParts) { ++ return globParts.map(parts => { ++ let gs = -1; ++ while (-1 !== (gs = parts.indexOf('**', gs + 1))) { ++ let i = gs; ++ while (parts[i + 1] === '**') { ++ i++; ++ } ++ if (i !== gs) { ++ parts.splice(gs, i - gs); ++ } ++ } ++ return parts; ++ }); ++ } ++ // get rid of adjascent ** and resolve .. portions ++ levelOneOptimize(globParts) { ++ return globParts.map(parts => { ++ parts = parts.reduce((set, part) => { ++ const prev = set[set.length - 1]; ++ if (part === '**' && prev === '**') { ++ return set; ++ } ++ if (part === '..') { ++ if (prev && prev !== '..' && prev !== '.' && prev !== '**') { ++ set.pop(); ++ return set; ++ } ++ } ++ set.push(part); ++ return set; ++ }, []); ++ return parts.length === 0 ? [''] : parts; ++ }); ++ } ++ levelTwoFileOptimize(parts) { ++ if (!Array.isArray(parts)) { ++ parts = this.slashSplit(parts); ++ } ++ let didSomething = false; ++ do { ++ didSomething = false; ++ //
// -> 
/
++				if (!this.preserveMultipleSlashes) {
++					for (let i = 1; i < parts.length - 1; i++) {
++						const p = parts[i];
++						// don't squeeze out UNC patterns
++						if (i === 1 && p === '' && parts[0] === '')
++							continue;
++						if (p === '.' || p === '') {
++							didSomething = true;
++							parts.splice(i, 1);
++							i--;
++						}
++					}
++					if (parts[0] === '.' &&
++						parts.length === 2 &&
++						(parts[1] === '.' || parts[1] === '')) {
++						didSomething = true;
++						parts.pop();
++					}
++				}
++				// 
/

/../ ->

/
++				let dd = 0;
++				while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
++					const p = parts[dd - 1];
++					if (p && p !== '.' && p !== '..' && p !== '**') {
++						didSomething = true;
++						parts.splice(dd - 1, 2);
++						dd -= 2;
++					}
++				}
++			} while (didSomething);
++			return parts.length === 0 ? [''] : parts;
++		}
++		// First phase: single-pattern processing
++		// 
 is 1 or more portions
++		//  is 1 or more portions
++		// 

is any portion other than ., .., '', or ** ++ // is . or '' ++ // ++ // **/.. is *brutal* for filesystem walking performance, because ++ // it effectively resets the recursive walk each time it occurs, ++ // and ** cannot be reduced out by a .. pattern part like a regexp ++ // or most strings (other than .., ., and '') can be. ++ // ++ //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/} ++ //

// -> 
/
++		// 
/

/../ ->

/
++		// **/**/ -> **/
++		//
++		// **/*/ -> */**/ <== not valid because ** doesn't follow
++		// this WOULD be allowed if ** did follow symlinks, or * didn't
++		firstPhasePreProcess(globParts) {
++			let didSomething = false;
++			do {
++				didSomething = false;
++				// 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/} ++ for (let parts of globParts) { ++ let gs = -1; ++ while (-1 !== (gs = parts.indexOf('**', gs + 1))) { ++ let gss = gs; ++ while (parts[gss + 1] === '**') { ++ //

/**/**/ -> 
/**/
++							gss++;
++						}
++						// eg, if gs is 2 and gss is 4, that means we have 3 **
++						// parts, and can remove 2 of them.
++						if (gss > gs) {
++							parts.splice(gs + 1, gss - gs);
++						}
++						let next = parts[gs + 1];
++						const p = parts[gs + 2];
++						const p2 = parts[gs + 3];
++						if (next !== '..')
++							continue;
++						if (!p ||
++							p === '.' ||
++							p === '..' ||
++							!p2 ||
++							p2 === '.' ||
++							p2 === '..') {
++							continue;
++						}
++						didSomething = true;
++						// edit parts in place, and push the new one
++						parts.splice(gs, 1);
++						const other = parts.slice(0);
++						other[gs] = '**';
++						globParts.push(other);
++						gs--;
++					}
++					// 
// -> 
/
++					if (!this.preserveMultipleSlashes) {
++						for (let i = 1; i < parts.length - 1; i++) {
++							const p = parts[i];
++							// don't squeeze out UNC patterns
++							if (i === 1 && p === '' && parts[0] === '')
++								continue;
++							if (p === '.' || p === '') {
++								didSomething = true;
++								parts.splice(i, 1);
++								i--;
++							}
++						}
++						if (parts[0] === '.' &&
++							parts.length === 2 &&
++							(parts[1] === '.' || parts[1] === '')) {
++							didSomething = true;
++							parts.pop();
++						}
++					}
++					// 
/

/../ ->

/
++					let dd = 0;
++					while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
++						const p = parts[dd - 1];
++						if (p && p !== '.' && p !== '..' && p !== '**') {
++							didSomething = true;
++							const needDot = dd === 1 && parts[dd + 1] === '**';
++							const splin = needDot ? ['.'] : [];
++							parts.splice(dd - 1, 2, ...splin);
++							if (parts.length === 0)
++								parts.push('');
++							dd -= 2;
++						}
++					}
++				}
++			} while (didSomething);
++			return globParts;
++		}
++		// second phase: multi-pattern dedupes
++		// {
/*/,
/

/} ->

/*/
++		// {
/,
/} -> 
/
++		// {
/**/,
/} -> 
/**/
++		//
++		// {
/**/,
/**/

/} ->

/**/
++		// ^-- not valid because ** doens't follow symlinks
++		secondPhasePreProcess(globParts) {
++			for (let i = 0; i < globParts.length - 1; i++) {
++				for (let j = i + 1; j < globParts.length; j++) {
++					const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
++					if (!matched)
++						continue;
++					globParts[i] = matched;
++					globParts[j] = [];
++				}
++			}
++			return globParts.filter(gs => gs.length);
++		}
++		partsMatch(a, b, emptyGSMatch = false) {
++			let ai = 0;
++			let bi = 0;
++			let result = [];
++			let which = '';
++			while (ai < a.length && bi < b.length) {
++				if (a[ai] === b[bi]) {
++					result.push(which === 'b' ? b[bi] : a[ai]);
++					ai++;
++					bi++;
++				}
++				else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
++					result.push(a[ai]);
++					ai++;
++				}
++				else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
++					result.push(b[bi]);
++					bi++;
++				}
++				else if (a[ai] === '*' &&
++					b[bi] &&
++					(this.options.dot || !b[bi].startsWith('.')) &&
++					b[bi] !== '**') {
++					if (which === 'b')
++						return false;
++					which = 'a';
++					result.push(a[ai]);
++					ai++;
++					bi++;
++				}
++				else if (b[bi] === '*' &&
++					a[ai] &&
++					(this.options.dot || !a[ai].startsWith('.')) &&
++					a[ai] !== '**') {
++					if (which === 'a')
++						return false;
++					which = 'b';
++					result.push(b[bi]);
++					ai++;
++					bi++;
++				}
++				else {
++					return false;
++				}
++			}
++			// if we fall out of the loop, it means they two are identical
++			// as long as their lengths match
++			return a.length === b.length && result;
++		}
++		parseNegate() {
++			if (this.nonegate)
++				return;
++			const pattern = this.pattern;
++			let negate = false;
++			let negateOffset = 0;
++			for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
++				negate = !negate;
++				negateOffset++;
++			}
++			if (negateOffset)
++				this.pattern = pattern.slice(negateOffset);
++			this.negate = negate;
++		}
++		// set partial to true to test if, for example,
++		// "/a/b" matches the start of "/*/b/*/d"
++		// Partial means, if you run out of file before you run
++		// out of pattern, then that's fine, as long as all
++		// the parts match.
++		matchOne(file, pattern, partial = false) {
++			const options = this.options;
++			// UNC paths like //?/X:/... can match X:/... and vice versa
++			// Drive letters in absolute drive or unc paths are always compared
++			// case-insensitively.
++			if (this.isWindows) {
++				const fileDrive = typeof file[0] === 'string' && /^[a-z]:$/i.test(file[0]);
++				const fileUNC = !fileDrive &&
++					file[0] === '' &&
++					file[1] === '' &&
++					file[2] === '?' &&
++					/^[a-z]:$/i.test(file[3]);
++				const patternDrive = typeof pattern[0] === 'string' && /^[a-z]:$/i.test(pattern[0]);
++				const patternUNC = !patternDrive &&
++					pattern[0] === '' &&
++					pattern[1] === '' &&
++					pattern[2] === '?' &&
++					typeof pattern[3] === 'string' &&
++					/^[a-z]:$/i.test(pattern[3]);
++				const fdi = fileUNC ? 3 : fileDrive ? 0 : undefined;
++				const pdi = patternUNC ? 3 : patternDrive ? 0 : undefined;
++				if (typeof fdi === 'number' && typeof pdi === 'number') {
++					const [fd, pd] = [file[fdi], pattern[pdi]];
++					if (fd.toLowerCase() === pd.toLowerCase()) {
++						pattern[pdi] = fd;
++						if (pdi > fdi) {
++							pattern = pattern.slice(pdi);
++						}
++						else if (fdi > pdi) {
++							file = file.slice(fdi);
++						}
++					}
++				}
++			}
++			// resolve and reduce . and .. portions in the file as well.
++			// dont' need to do the second phase, because it's only one string[]
++			const { optimizationLevel = 1 } = this.options;
++			if (optimizationLevel >= 2) {
++				file = this.levelTwoFileOptimize(file);
++			}
++			this.debug('matchOne', this, { file, pattern });
++			this.debug('matchOne', file.length, pattern.length);
++			for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
++				this.debug('matchOne loop');
++				var p = pattern[pi];
++				var f = file[fi];
++				this.debug(pattern, p, f);
++				// should be impossible.
++				// some invalid regexp stuff in the set.
++				/* c8 ignore start */
++				if (p === false) {
++					return false;
++				}
++				/* c8 ignore stop */
++				if (p === exports.GLOBSTAR) {
++					this.debug('GLOBSTAR', [pattern, p, f]);
++					// "**"
++					// a/**/b/**/c would match the following:
++					// a/b/x/y/z/c
++					// a/x/y/z/b/c
++					// a/b/x/b/x/c
++					// a/b/c
++					// To do this, take the rest of the pattern after
++					// the **, and see if it would match the file remainder.
++					// If so, return success.
++					// If not, the ** "swallows" a segment, and try again.
++					// This is recursively awful.
++					//
++					// a/**/b/**/c matching a/b/x/y/z/c
++					// - a matches a
++					// - doublestar
++					//   - matchOne(b/x/y/z/c, b/**/c)
++					//     - b matches b
++					//     - doublestar
++					//       - matchOne(x/y/z/c, c) -> no
++					//       - matchOne(y/z/c, c) -> no
++					//       - matchOne(z/c, c) -> no
++					//       - matchOne(c, c) yes, hit
++					var fr = fi;
++					var pr = pi + 1;
++					if (pr === pl) {
++						this.debug('** at the end');
++						// a ** at the end will just swallow the rest.
++						// We have found a match.
++						// however, it will not swallow /.x, unless
++						// options.dot is set.
++						// . and .. are *never* matched by **, for explosively
++						// exponential reasons.
++						for (; fi < fl; fi++) {
++							if (file[fi] === '.' ||
++								file[fi] === '..' ||
++								(!options.dot && file[fi].charAt(0) === '.'))
++								return false;
++						}
++						return true;
++					}
++					// ok, let's see if we can swallow whatever we can.
++					while (fr < fl) {
++						var swallowee = file[fr];
++						this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
++						// XXX remove this slice.  Just pass the start index.
++						if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
++							this.debug('globstar found match!', fr, fl, swallowee);
++							// found a match.
++							return true;
++						}
++						else {
++							// can't swallow "." or ".." ever.
++							// can only swallow ".foo" when explicitly asked.
++							if (swallowee === '.' ||
++								swallowee === '..' ||
++								(!options.dot && swallowee.charAt(0) === '.')) {
++								this.debug('dot detected!', file, fr, pattern, pr);
++								break;
++							}
++							// ** swallows a segment, and continue.
++							this.debug('globstar swallow a segment, and continue');
++							fr++;
++						}
++					}
++					// no match was found.
++					// However, in partial mode, we can't say this is necessarily over.
++					/* c8 ignore start */
++					if (partial) {
++						// ran out of file
++						this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
++						if (fr === fl) {
++							return true;
++						}
++					}
++					/* c8 ignore stop */
++					return false;
++				}
++				// something other than **
++				// non-magic patterns just have to match exactly
++				// patterns with magic have been turned into regexps.
++				let hit;
++				if (typeof p === 'string') {
++					hit = f === p;
++					this.debug('string match', p, f, hit);
++				}
++				else {
++					hit = p.test(f);
++					this.debug('pattern match', p, f, hit);
++				}
++				if (!hit)
++					return false;
++			}
++			// Note: ending in / means that we'll get a final ""
++			// at the end of the pattern.  This can only match a
++			// corresponding "" at the end of the file.
++			// If the file ends in /, then it can only match a
++			// a pattern that ends in /, unless the pattern just
++			// doesn't have any more for it. But, a/b/ should *not*
++			// match "a/b/*", even though "" matches against the
++			// [^/]*? pattern, except in partial mode, where it might
++			// simply not be reached yet.
++			// However, a/b/ should still satisfy a/*
++			// now either we fell off the end of the pattern, or we're done.
++			if (fi === fl && pi === pl) {
++				// ran out of pattern and filename at the same time.
++				// an exact hit!
++				return true;
++			}
++			else if (fi === fl) {
++				// ran out of file, but still had pattern left.
++				// this is ok if we're doing the match as part of
++				// a glob fs traversal.
++				return partial;
++			}
++			else if (pi === pl) {
++				// ran out of pattern, still have file left.
++				// this is only acceptable if we're on the very last
++				// empty segment of a file with a trailing slash.
++				// a/* should match a/b/
++				return fi === fl - 1 && file[fi] === '';
++				/* c8 ignore start */
++			}
++			else {
++				// should be unreachable.
++				throw new Error('wtf?');
++			}
++			/* c8 ignore stop */
++		}
++		braceExpand() {
++			return (0, exports.braceExpand)(this.pattern, this.options);
++		}
++		parse(pattern) {
++			(0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
++			const options = this.options;
++			// shortcuts
++			if (pattern === '**')
++				return exports.GLOBSTAR;
++			if (pattern === '')
++				return '';
++			// far and away, the most common glob pattern parts are
++			// *, *.*, and *.  Add a fast check method for those.
++			let m;
++			let fastTest = null;
++			if ((m = pattern.match(starRE))) {
++				fastTest = options.dot ? starTestDot : starTest;
++			}
++			else if ((m = pattern.match(starDotExtRE))) {
++				fastTest = (options.nocase
++					? options.dot
++						? starDotExtTestNocaseDot
++						: starDotExtTestNocase
++					: options.dot
++						? starDotExtTestDot
++						: starDotExtTest)(m[1]);
++			}
++			else if ((m = pattern.match(qmarksRE))) {
++				fastTest = (options.nocase
++					? options.dot
++						? qmarksTestNocaseDot
++						: qmarksTestNocase
++					: options.dot
++						? qmarksTestDot
++						: qmarksTest)(m);
++			}
++			else if ((m = pattern.match(starDotStarRE))) {
++				fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
++			}
++			else if ((m = pattern.match(dotStarRE))) {
++				fastTest = dotStarTest;
++			}
++			const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
++			return fastTest ? Object.assign(re, { test: fastTest }) : re;
++		}
++		makeRe() {
++			if (this.regexp || this.regexp === false)
++				return this.regexp;
++			// at this point, this.set is a 2d array of partial
++			// pattern strings, or "**".
++			//
++			// It's better to use .match().  This function shouldn't
++			// be used, really, but it's pretty convenient sometimes,
++			// when you just want to work with a regex.
++			const set = this.set;
++			if (!set.length) {
++				this.regexp = false;
++				return this.regexp;
++			}
++			const options = this.options;
++			const twoStar = options.noglobstar
++				? star
++				: options.dot
++					? twoStarDot
++					: twoStarNoDot;
++			const flags = new Set(options.nocase ? ['i'] : []);
++			// regexpify non-globstar patterns
++			// if ** is only item, then we just do one twoStar
++			// if ** is first, and there are more, prepend (\/|twoStar\/)? to next
++			// if ** is last, append (\/twoStar|) to previous
++			// if ** is in the middle, append (\/|\/twoStar\/) to previous
++			// then filter out GLOBSTAR symbols
++			let re = set
++				.map(pattern => {
++				const pp = pattern.map(p => {
++					if (p instanceof RegExp) {
++						for (const f of p.flags.split(''))
++							flags.add(f);
++					}
++					return typeof p === 'string'
++						? regExpEscape(p)
++						: p === exports.GLOBSTAR
++							? exports.GLOBSTAR
++							: p._src;
++				});
++				pp.forEach((p, i) => {
++					const next = pp[i + 1];
++					const prev = pp[i - 1];
++					if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
++						return;
++					}
++					if (prev === undefined) {
++						if (next !== undefined && next !== exports.GLOBSTAR) {
++							pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
++						}
++						else {
++							pp[i] = twoStar;
++						}
++					}
++					else if (next === undefined) {
++						pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
++					}
++					else if (next !== exports.GLOBSTAR) {
++						pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
++						pp[i + 1] = exports.GLOBSTAR;
++					}
++				});
++				return pp.filter(p => p !== exports.GLOBSTAR).join('/');
++			})
++				.join('|');
++			// need to wrap in parens if we had more than one thing with |,
++			// otherwise only the first will be anchored to ^ and the last to $
++			const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
++			// must match entire pattern
++			// ending in a * or ** will make it less strict.
++			re = '^' + open + re + close + '$';
++			// can match anything, as long as it's not this.
++			if (this.negate)
++				re = '^(?!' + re + ').+$';
++			try {
++				this.regexp = new RegExp(re, [...flags].join(''));
++				/* c8 ignore start */
++			}
++			catch (ex) {
++				// should be impossible
++				this.regexp = false;
++			}
++			/* c8 ignore stop */
++			return this.regexp;
++		}
++		slashSplit(p) {
++			// if p starts with // on windows, we preserve that
++			// so that UNC paths aren't broken.  Otherwise, any number of
++			// / characters are coalesced into one, unless
++			// preserveMultipleSlashes is set to true.
++			if (this.preserveMultipleSlashes) {
++				return p.split('/');
++			}
++			else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
++				// add an extra '' for the one we lose
++				return ['', ...p.split(/\/+/)];
++			}
++			else {
++				return p.split(/\/+/);
++			}
++		}
++		match(f, partial = this.partial) {
++			this.debug('match', f, this.pattern);
++			// short-circuit in the case of busted things.
++			// comments, etc.
++			if (this.comment) {
++				return false;
++			}
++			if (this.empty) {
++				return f === '';
++			}
++			if (f === '/' && partial) {
++				return true;
++			}
++			const options = this.options;
++			// windows: need to use /, not \
++			if (this.isWindows) {
++				f = f.split('\\').join('/');
++			}
++			// treat the test path as a set of pathparts.
++			const ff = this.slashSplit(f);
++			this.debug(this.pattern, 'split', ff);
++			// just ONE of the pattern sets in this.set needs to match
++			// in order for it to be valid.  If negating, then just one
++			// match means that we have failed.
++			// Either way, return on the first hit.
++			const set = this.set;
++			this.debug(this.pattern, 'set', set);
++			// Find the basename of the path by looking for the last non-empty segment
++			let filename = ff[ff.length - 1];
++			if (!filename) {
++				for (let i = ff.length - 2; !filename && i >= 0; i--) {
++					filename = ff[i];
++				}
++			}
++			for (let i = 0; i < set.length; i++) {
++				const pattern = set[i];
++				let file = ff;
++				if (options.matchBase && pattern.length === 1) {
++					file = [filename];
++				}
++				const hit = this.matchOne(file, pattern, partial);
++				if (hit) {
++					if (options.flipNegate) {
++						return true;
++					}
++					return !this.negate;
++				}
++			}
++			// didn't get any hits.  this is success if it's a negative
++			// pattern, failure otherwise.
++			if (options.flipNegate) {
++				return false;
++			}
++			return this.negate;
++		}
++		static defaults(def) {
++			return exports.minimatch.defaults(def).Minimatch;
++		}
++	}
++	exports.Minimatch = Minimatch;
++	/* c8 ignore start */
++	var ast_js_2 = __webpack_require__(10);
++	Object.defineProperty(exports, "AST", ({ enumerable: true, get: function () { return ast_js_2.AST; } }));
++	var escape_js_2 = __webpack_require__(13);
++	Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return escape_js_2.escape; } }));
++	var unescape_js_2 = __webpack_require__(12);
++	Object.defineProperty(exports, "unescape", ({ enumerable: true, get: function () { return unescape_js_2.unescape; } }));
++	/* c8 ignore stop */
++	exports.minimatch.AST = ast_js_1.AST;
++	exports.minimatch.Minimatch = Minimatch;
++	exports.minimatch.escape = escape_js_1.escape;
++	exports.minimatch.unescape = unescape_js_1.unescape;
++	//# sourceMappingURL=index.js.map
++
++	/***/ }),
++	/* 7 */
++	/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
++
++	var balanced = __webpack_require__(8);
++
++	module.exports = expandTop;
++
++	var escSlash = '\0SLASH'+Math.random()+'\0';
++	var escOpen = '\0OPEN'+Math.random()+'\0';
++	var escClose = '\0CLOSE'+Math.random()+'\0';
++	var escComma = '\0COMMA'+Math.random()+'\0';
++	var escPeriod = '\0PERIOD'+Math.random()+'\0';
++
++	function numeric(str) {
++	  return parseInt(str, 10) == str
++		? parseInt(str, 10)
++		: str.charCodeAt(0);
++	}
++
++	function escapeBraces(str) {
++	  return str.split('\\\\').join(escSlash)
++				.split('\\{').join(escOpen)
++				.split('\\}').join(escClose)
++				.split('\\,').join(escComma)
++				.split('\\.').join(escPeriod);
++	}
++
++	function unescapeBraces(str) {
++	  return str.split(escSlash).join('\\')
++				.split(escOpen).join('{')
++				.split(escClose).join('}')
++				.split(escComma).join(',')
++				.split(escPeriod).join('.');
++	}
++
++
++	// Basically just str.split(","), but handling cases
++	// where we have nested braced sections, which should be
++	// treated as individual members, like {a,{b,c},d}
++	function parseCommaParts(str) {
++	  if (!str)
++		return [''];
++
++	  var parts = [];
++	  var m = balanced('{', '}', str);
++
++	  if (!m)
++		return str.split(',');
++
++	  var pre = m.pre;
++	  var body = m.body;
++	  var post = m.post;
++	  var p = pre.split(',');
++
++	  p[p.length-1] += '{' + body + '}';
++	  var postParts = parseCommaParts(post);
++	  if (post.length) {
++		p[p.length-1] += postParts.shift();
++		p.push.apply(p, postParts);
++	  }
++
++	  parts.push.apply(parts, p);
++
++	  return parts;
++	}
++
++	function expandTop(str) {
++	  if (!str)
++		return [];
++
++	  // I don't know why Bash 4.3 does this, but it does.
++	  // Anything starting with {} will have the first two bytes preserved
++	  // but *only* at the top level, so {},a}b will not expand to anything,
++	  // but a{},b}c will be expanded to [a}c,abc].
++	  // One could argue that this is a bug in Bash, but since the goal of
++	  // this module is to match Bash's rules, we escape a leading {}
++	  if (str.substr(0, 2) === '{}') {
++		str = '\\{\\}' + str.substr(2);
++	  }
++
++	  return expand(escapeBraces(str), true).map(unescapeBraces);
++	}
++
++	function embrace(str) {
++	  return '{' + str + '}';
++	}
++	function isPadded(el) {
++	  return /^-?0\d/.test(el);
++	}
++
++	function lte(i, y) {
++	  return i <= y;
++	}
++	function gte(i, y) {
++	  return i >= y;
++	}
++
++	function expand(str, isTop) {
++	  var expansions = [];
++
++	  var m = balanced('{', '}', str);
++	  if (!m) return [str];
++
++	  // no need to expand pre, since it is guaranteed to be free of brace-sets
++	  var pre = m.pre;
++	  var post = m.post.length
++		? expand(m.post, false)
++		: [''];
++
++	  if (/\$$/.test(m.pre)) {
++		for (var k = 0; k < post.length; k++) {
++		  var expansion = pre+ '{' + m.body + '}' + post[k];
++		  expansions.push(expansion);
++		}
++	  } else {
++		var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
++		var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
++		var isSequence = isNumericSequence || isAlphaSequence;
++		var isOptions = m.body.indexOf(',') >= 0;
++		if (!isSequence && !isOptions) {
++		  // {a},b}
++		  if (m.post.match(/,.*\}/)) {
++			str = m.pre + '{' + m.body + escClose + m.post;
++			return expand(str);
++		  }
++		  return [str];
++		}
++
++		var n;
++		if (isSequence) {
++		  n = m.body.split(/\.\./);
++		} else {
++		  n = parseCommaParts(m.body);
++		  if (n.length === 1) {
++			// x{{a,b}}y ==> x{a}y x{b}y
++			n = expand(n[0], false).map(embrace);
++			if (n.length === 1) {
++			  return post.map(function(p) {
++				return m.pre + n[0] + p;
++			  });
++			}
++		  }
++		}
++
++		// at this point, n is the parts, and we know it's not a comma set
++		// with a single entry.
++		var N;
++
++		if (isSequence) {
++		  var x = numeric(n[0]);
++		  var y = numeric(n[1]);
++		  var width = Math.max(n[0].length, n[1].length)
++		  var incr = n.length == 3
++			? Math.abs(numeric(n[2]))
++			: 1;
++		  var test = lte;
++		  var reverse = y < x;
++		  if (reverse) {
++			incr *= -1;
++			test = gte;
++		  }
++		  var pad = n.some(isPadded);
++
++		  N = [];
++
++		  for (var i = x; test(i, y); i += incr) {
++			var c;
++			if (isAlphaSequence) {
++			  c = String.fromCharCode(i);
++			  if (c === '\\')
++				c = '';
++			} else {
++			  c = String(i);
++			  if (pad) {
++				var need = width - c.length;
++				if (need > 0) {
++				  var z = new Array(need + 1).join('0');
++				  if (i < 0)
++					c = '-' + z + c.slice(1);
++				  else
++					c = z + c;
++				}
++			  }
++			}
++			N.push(c);
++		  }
++		} else {
++		  N = [];
++
++		  for (var j = 0; j < n.length; j++) {
++			N.push.apply(N, expand(n[j], false));
++		  }
++		}
++
++		for (var j = 0; j < N.length; j++) {
++		  for (var k = 0; k < post.length; k++) {
++			var expansion = pre + N[j] + post[k];
++			if (!isTop || isSequence || expansion)
++			  expansions.push(expansion);
++		  }
++		}
++	  }
++
++	  return expansions;
++	}
++
++
++
++	/***/ }),
++	/* 8 */
++	/***/ ((module) => {
++
++	"use strict";
++
++	module.exports = balanced;
++	function balanced(a, b, str) {
++	  if (a instanceof RegExp) a = maybeMatch(a, str);
++	  if (b instanceof RegExp) b = maybeMatch(b, str);
++
++	  var r = range(a, b, str);
++
++	  return r && {
++		start: r[0],
++		end: r[1],
++		pre: str.slice(0, r[0]),
++		body: str.slice(r[0] + a.length, r[1]),
++		post: str.slice(r[1] + b.length)
++	  };
++	}
++
++	function maybeMatch(reg, str) {
++	  var m = str.match(reg);
++	  return m ? m[0] : null;
++	}
++
++	balanced.range = range;
++	function range(a, b, str) {
++	  var begs, beg, left, right, result;
++	  var ai = str.indexOf(a);
++	  var bi = str.indexOf(b, ai + 1);
++	  var i = ai;
++
++	  if (ai >= 0 && bi > 0) {
++		if(a===b) {
++		  return [ai, bi];
++		}
++		begs = [];
++		left = str.length;
++
++		while (i >= 0 && !result) {
++		  if (i == ai) {
++			begs.push(i);
++			ai = str.indexOf(a, i + 1);
++		  } else if (begs.length == 1) {
++			result = [ begs.pop(), bi ];
++		  } else {
++			beg = begs.pop();
++			if (beg < left) {
++			  left = beg;
++			  right = bi;
++			}
++
++			bi = str.indexOf(b, i + 1);
++		  }
++
++		  i = ai < bi && ai >= 0 ? ai : bi;
++		}
++
++		if (begs.length) {
++		  result = [ left, right ];
++		}
++	  }
++
++	  return result;
++	}
++
++
++	/***/ }),
++	/* 9 */
++	/***/ ((__unused_webpack_module, exports) => {
++
++	"use strict";
++
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.assertValidPattern = void 0;
++	const MAX_PATTERN_LENGTH = 1024 * 64;
++	const assertValidPattern = (pattern) => {
++		if (typeof pattern !== 'string') {
++			throw new TypeError('invalid pattern');
++		}
++		if (pattern.length > MAX_PATTERN_LENGTH) {
++			throw new TypeError('pattern is too long');
++		}
++	};
++	exports.assertValidPattern = assertValidPattern;
++	//# sourceMappingURL=assert-valid-pattern.js.map
++
++	/***/ }),
++	/* 10 */
++	/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
++
++	"use strict";
++
++	// parse a single path portion
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.AST = void 0;
++	const brace_expressions_js_1 = __webpack_require__(11);
++	const unescape_js_1 = __webpack_require__(12);
++	const types = new Set(['!', '?', '+', '*', '@']);
++	const isExtglobType = (c) => types.has(c);
++	// Patterns that get prepended to bind to the start of either the
++	// entire string, or just a single path portion, to prevent dots
++	// and/or traversal patterns, when needed.
++	// Exts don't need the ^ or / bit, because the root binds that already.
++	const startNoTraversal = '(?!(?:^|/)\\.\\.?(?:$|/))';
++	const startNoDot = '(?!\\.)';
++	// characters that indicate a start of pattern needs the "no dots" bit,
++	// because a dot *might* be matched. ( is not in the list, because in
++	// the case of a child extglob, it will handle the prevention itself.
++	const addPatternStart = new Set(['[', '.']);
++	// cases where traversal is A-OK, no dot prevention needed
++	const justDots = new Set(['..', '.']);
++	const reSpecials = new Set('().*{}+?[]^$\\!');
++	const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
++	// any single thing other than /
++	const qmark = '[^/]';
++	// * => any number of characters
++	const star = qmark + '*?';
++	// use + when we need to ensure that *something* matches, because the * is
++	// the only thing in the path portion.
++	const starNoEmpty = qmark + '+?';
++	// remove the \ chars that we added if we end up doing a nonmagic compare
++	// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
++	class AST {
++		type;
++		#root;
++		#hasMagic;
++		#uflag = false;
++		#parts = [];
++		#parent;
++		#parentIndex;
++		#negs;
++		#filledNegs = false;
++		#options;
++		#toString;
++		// set to true if it's an extglob with no children
++		// (which really means one child of '')
++		#emptyExt = false;
++		constructor(type, parent, options = {}) {
++			this.type = type;
++			// extglobs are inherently magical
++			if (type)
++				this.#hasMagic = true;
++			this.#parent = parent;
++			this.#root = this.#parent ? this.#parent.#root : this;
++			this.#options = this.#root === this ? options : this.#root.#options;
++			this.#negs = this.#root === this ? [] : this.#root.#negs;
++			if (type === '!' && !this.#root.#filledNegs)
++				this.#negs.push(this);
++			this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
++		}
++		get hasMagic() {
++			/* c8 ignore start */
++			if (this.#hasMagic !== undefined)
++				return this.#hasMagic;
++			/* c8 ignore stop */
++			for (const p of this.#parts) {
++				if (typeof p === 'string')
++					continue;
++				if (p.type || p.hasMagic)
++					return (this.#hasMagic = true);
++			}
++			// note: will be undefined until we generate the regexp src and find out
++			return this.#hasMagic;
++		}
++		// reconstructs the pattern
++		toString() {
++			if (this.#toString !== undefined)
++				return this.#toString;
++			if (!this.type) {
++				return (this.#toString = this.#parts.map(p => String(p)).join(''));
++			}
++			else {
++				return (this.#toString =
++					this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
++			}
++		}
++		#fillNegs() {
++			/* c8 ignore start */
++			if (this !== this.#root)
++				throw new Error('should only call on root');
++			if (this.#filledNegs)
++				return this;
++			/* c8 ignore stop */
++			// call toString() once to fill this out
++			this.toString();
++			this.#filledNegs = true;
++			let n;
++			while ((n = this.#negs.pop())) {
++				if (n.type !== '!')
++					continue;
++				// walk up the tree, appending everthing that comes AFTER parentIndex
++				let p = n;
++				let pp = p.#parent;
++				while (pp) {
++					for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
++						for (const part of n.#parts) {
++							/* c8 ignore start */
++							if (typeof part === 'string') {
++								throw new Error('string part in extglob AST??');
++							}
++							/* c8 ignore stop */
++							part.copyIn(pp.#parts[i]);
++						}
++					}
++					p = pp;
++					pp = p.#parent;
++				}
++			}
++			return this;
++		}
++		push(...parts) {
++			for (const p of parts) {
++				if (p === '')
++					continue;
++				/* c8 ignore start */
++				if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
++					throw new Error('invalid part: ' + p);
++				}
++				/* c8 ignore stop */
++				this.#parts.push(p);
++			}
++		}
++		toJSON() {
++			const ret = this.type === null
++				? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
++				: [this.type, ...this.#parts.map(p => p.toJSON())];
++			if (this.isStart() && !this.type)
++				ret.unshift([]);
++			if (this.isEnd() &&
++				(this === this.#root ||
++					(this.#root.#filledNegs && this.#parent?.type === '!'))) {
++				ret.push({});
++			}
++			return ret;
++		}
++		isStart() {
++			if (this.#root === this)
++				return true;
++			// if (this.type) return !!this.#parent?.isStart()
++			if (!this.#parent?.isStart())
++				return false;
++			if (this.#parentIndex === 0)
++				return true;
++			// if everything AHEAD of this is a negation, then it's still the "start"
++			const p = this.#parent;
++			for (let i = 0; i < this.#parentIndex; i++) {
++				const pp = p.#parts[i];
++				if (!(pp instanceof AST && pp.type === '!')) {
++					return false;
++				}
++			}
++			return true;
++		}
++		isEnd() {
++			if (this.#root === this)
++				return true;
++			if (this.#parent?.type === '!')
++				return true;
++			if (!this.#parent?.isEnd())
++				return false;
++			if (!this.type)
++				return this.#parent?.isEnd();
++			// if not root, it'll always have a parent
++			/* c8 ignore start */
++			const pl = this.#parent ? this.#parent.#parts.length : 0;
++			/* c8 ignore stop */
++			return this.#parentIndex === pl - 1;
++		}
++		copyIn(part) {
++			if (typeof part === 'string')
++				this.push(part);
++			else
++				this.push(part.clone(this));
++		}
++		clone(parent) {
++			const c = new AST(this.type, parent);
++			for (const p of this.#parts) {
++				c.copyIn(p);
++			}
++			return c;
++		}
++		static #parseAST(str, ast, pos, opt) {
++			let escaping = false;
++			let inBrace = false;
++			let braceStart = -1;
++			let braceNeg = false;
++			if (ast.type === null) {
++				// outside of a extglob, append until we find a start
++				let i = pos;
++				let acc = '';
++				while (i < str.length) {
++					const c = str.charAt(i++);
++					// still accumulate escapes at this point, but we do ignore
++					// starts that are escaped
++					if (escaping || c === '\\') {
++						escaping = !escaping;
++						acc += c;
++						continue;
++					}
++					if (inBrace) {
++						if (i === braceStart + 1) {
++							if (c === '^' || c === '!') {
++								braceNeg = true;
++							}
++						}
++						else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
++							inBrace = false;
++						}
++						acc += c;
++						continue;
++					}
++					else if (c === '[') {
++						inBrace = true;
++						braceStart = i;
++						braceNeg = false;
++						acc += c;
++						continue;
++					}
++					if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
++						ast.push(acc);
++						acc = '';
++						const ext = new AST(c, ast);
++						i = AST.#parseAST(str, ext, i, opt);
++						ast.push(ext);
++						continue;
++					}
++					acc += c;
++				}
++				ast.push(acc);
++				return i;
++			}
++			// some kind of extglob, pos is at the (
++			// find the next | or )
++			let i = pos + 1;
++			let part = new AST(null, ast);
++			const parts = [];
++			let acc = '';
++			while (i < str.length) {
++				const c = str.charAt(i++);
++				// still accumulate escapes at this point, but we do ignore
++				// starts that are escaped
++				if (escaping || c === '\\') {
++					escaping = !escaping;
++					acc += c;
++					continue;
++				}
++				if (inBrace) {
++					if (i === braceStart + 1) {
++						if (c === '^' || c === '!') {
++							braceNeg = true;
++						}
++					}
++					else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
++						inBrace = false;
++					}
++					acc += c;
++					continue;
++				}
++				else if (c === '[') {
++					inBrace = true;
++					braceStart = i;
++					braceNeg = false;
++					acc += c;
++					continue;
++				}
++				if (isExtglobType(c) && str.charAt(i) === '(') {
++					part.push(acc);
++					acc = '';
++					const ext = new AST(c, part);
++					part.push(ext);
++					i = AST.#parseAST(str, ext, i, opt);
++					continue;
++				}
++				if (c === '|') {
++					part.push(acc);
++					acc = '';
++					parts.push(part);
++					part = new AST(null, ast);
++					continue;
++				}
++				if (c === ')') {
++					if (acc === '' && ast.#parts.length === 0) {
++						ast.#emptyExt = true;
++					}
++					part.push(acc);
++					acc = '';
++					ast.push(...parts, part);
++					return i;
++				}
++				acc += c;
++			}
++			// unfinished extglob
++			// if we got here, it was a malformed extglob! not an extglob, but
++			// maybe something else in there.
++			ast.type = null;
++			ast.#hasMagic = undefined;
++			ast.#parts = [str.substring(pos - 1)];
++			return i;
++		}
++		static fromGlob(pattern, options = {}) {
++			const ast = new AST(null, undefined, options);
++			AST.#parseAST(pattern, ast, 0, options);
++			return ast;
++		}
++		// returns the regular expression if there's magic, or the unescaped
++		// string if not.
++		toMMPattern() {
++			// should only be called on root
++			/* c8 ignore start */
++			if (this !== this.#root)
++				return this.#root.toMMPattern();
++			/* c8 ignore stop */
++			const glob = this.toString();
++			const [re, body, hasMagic, uflag] = this.toRegExpSource();
++			// if we're in nocase mode, and not nocaseMagicOnly, then we do
++			// still need a regular expression if we have to case-insensitively
++			// match capital/lowercase characters.
++			const anyMagic = hasMagic ||
++				this.#hasMagic ||
++				(this.#options.nocase &&
++					!this.#options.nocaseMagicOnly &&
++					glob.toUpperCase() !== glob.toLowerCase());
++			if (!anyMagic) {
++				return body;
++			}
++			const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
++			return Object.assign(new RegExp(`^${re}$`, flags), {
++				_src: re,
++				_glob: glob,
++			});
++		}
++		// returns the string match, the regexp source, whether there's magic
++		// in the regexp (so a regular expression is required) and whether or
++		// not the uflag is needed for the regular expression (for posix classes)
++		// TODO: instead of injecting the start/end at this point, just return
++		// the BODY of the regexp, along with the start/end portions suitable
++		// for binding the start/end in either a joined full-path makeRe context
++		// (where we bind to (^|/), or a standalone matchPart context (where
++		// we bind to ^, and not /).  Otherwise slashes get duped!
++		//
++		// In part-matching mode, the start is:
++		// - if not isStart: nothing
++		// - if traversal possible, but not allowed: ^(?!\.\.?$)
++		// - if dots allowed or not possible: ^
++		// - if dots possible and not allowed: ^(?!\.)
++		// end is:
++		// - if not isEnd(): nothing
++		// - else: $
++		//
++		// In full-path matching mode, we put the slash at the START of the
++		// pattern, so start is:
++		// - if first pattern: same as part-matching mode
++		// - if not isStart(): nothing
++		// - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
++		// - if dots allowed or not possible: /
++		// - if dots possible and not allowed: /(?!\.)
++		// end is:
++		// - if last pattern, same as part-matching mode
++		// - else nothing
++		//
++		// Always put the (?:$|/) on negated tails, though, because that has to be
++		// there to bind the end of the negated pattern portion, and it's easier to
++		// just stick it in now rather than try to inject it later in the middle of
++		// the pattern.
++		//
++		// We can just always return the same end, and leave it up to the caller
++		// to know whether it's going to be used joined or in parts.
++		// And, if the start is adjusted slightly, can do the same there:
++		// - if not isStart: nothing
++		// - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
++		// - if dots allowed or not possible: (?:/|^)
++		// - if dots possible and not allowed: (?:/|^)(?!\.)
++		//
++		// But it's better to have a simpler binding without a conditional, for
++		// performance, so probably better to return both start options.
++		//
++		// Then the caller just ignores the end if it's not the first pattern,
++		// and the start always gets applied.
++		//
++		// But that's always going to be $ if it's the ending pattern, or nothing,
++		// so the caller can just attach $ at the end of the pattern when building.
++		//
++		// So the todo is:
++		// - better detect what kind of start is needed
++		// - return both flavors of starting pattern
++		// - attach $ at the end of the pattern when creating the actual RegExp
++		//
++		// Ah, but wait, no, that all only applies to the root when the first pattern
++		// is not an extglob. If the first pattern IS an extglob, then we need all
++		// that dot prevention biz to live in the extglob portions, because eg
++		// +(*|.x*) can match .xy but not .yx.
++		//
++		// So, return the two flavors if it's #root and the first child is not an
++		// AST, otherwise leave it to the child AST to handle it, and there,
++		// use the (?:^|/) style of start binding.
++		//
++		// Even simplified further:
++		// - Since the start for a join is eg /(?!\.) and the start for a part
++		// is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
++		// or start or whatever) and prepend ^ or / at the Regexp construction.
++		toRegExpSource(allowDot) {
++			const dot = allowDot ?? !!this.#options.dot;
++			if (this.#root === this)
++				this.#fillNegs();
++			if (!this.type) {
++				const noEmpty = this.isStart() && this.isEnd();
++				const src = this.#parts
++					.map(p => {
++					const [re, _, hasMagic, uflag] = typeof p === 'string'
++						? AST.#parseGlob(p, this.#hasMagic, noEmpty)
++						: p.toRegExpSource(allowDot);
++					this.#hasMagic = this.#hasMagic || hasMagic;
++					this.#uflag = this.#uflag || uflag;
++					return re;
++				})
++					.join('');
++				let start = '';
++				if (this.isStart()) {
++					if (typeof this.#parts[0] === 'string') {
++						// this is the string that will match the start of the pattern,
++						// so we need to protect against dots and such.
++						// '.' and '..' cannot match unless the pattern is that exactly,
++						// even if it starts with . or dot:true is set.
++						const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
++						if (!dotTravAllowed) {
++							const aps = addPatternStart;
++							// check if we have a possibility of matching . or ..,
++							// and prevent that.
++							const needNoTrav =
++							// dots are allowed, and the pattern starts with [ or .
++							(dot && aps.has(src.charAt(0))) ||
++								// the pattern starts with \., and then [ or .
++								(src.startsWith('\\.') && aps.has(src.charAt(2))) ||
++								// the pattern starts with \.\., and then [ or .
++								(src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
++							// no need to prevent dots if it can't match a dot, or if a
++							// sub-pattern will be preventing it anyway.
++							const needNoDot = !dot && !allowDot && aps.has(src.charAt(0));
++							start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
++						}
++					}
++				}
++				// append the "end of path portion" pattern to negation tails
++				let end = '';
++				if (this.isEnd() &&
++					this.#root.#filledNegs &&
++					this.#parent?.type === '!') {
++					end = '(?:$|\\/)';
++				}
++				const final = start + src + end;
++				return [
++					final,
++					(0, unescape_js_1.unescape)(src),
++					(this.#hasMagic = !!this.#hasMagic),
++					this.#uflag,
++				];
++			}
++			// We need to calculate the body *twice* if it's a repeat pattern
++			// at the start, once in nodot mode, then again in dot mode, so a
++			// pattern like *(?) can match 'x.y'
++			const repeated = this.type === '*' || this.type === '+';
++			// some kind of extglob
++			const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
++			let body = this.#partsToRegExp(dot);
++			if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
++				// invalid extglob, has to at least be *something* present, if it's
++				// the entire path portion.
++				const s = this.toString();
++				this.#parts = [s];
++				this.type = null;
++				this.#hasMagic = undefined;
++				return [s, (0, unescape_js_1.unescape)(this.toString()), false, false];
++			}
++			// XXX abstract out this map method
++			let bodyDotAllowed = !repeated || allowDot || dot || !startNoDot
++				? ''
++				: this.#partsToRegExp(true);
++			if (bodyDotAllowed === body) {
++				bodyDotAllowed = '';
++			}
++			if (bodyDotAllowed) {
++				body = `(?:${body})(?:${bodyDotAllowed})*?`;
++			}
++			// an empty !() is exactly equivalent to a starNoEmpty
++			let final = '';
++			if (this.type === '!' && this.#emptyExt) {
++				final = (this.isStart() && !dot ? startNoDot : '') + starNoEmpty;
++			}
++			else {
++				const close = this.type === '!'
++					? // !() must match something,but !(x) can match ''
++						'))' +
++							(this.isStart() && !dot && !allowDot ? startNoDot : '') +
++							star +
++							')'
++					: this.type === '@'
++						? ')'
++						: this.type === '?'
++							? ')?'
++							: this.type === '+' && bodyDotAllowed
++								? ')'
++								: this.type === '*' && bodyDotAllowed
++									? `)?`
++									: `)${this.type}`;
++				final = start + body + close;
++			}
++			return [
++				final,
++				(0, unescape_js_1.unescape)(body),
++				(this.#hasMagic = !!this.#hasMagic),
++				this.#uflag,
++			];
++		}
++		#partsToRegExp(dot) {
++			return this.#parts
++				.map(p => {
++				// extglob ASTs should only contain parent ASTs
++				/* c8 ignore start */
++				if (typeof p === 'string') {
++					throw new Error('string type in extglob ast??');
++				}
++				/* c8 ignore stop */
++				// can ignore hasMagic, because extglobs are already always magic
++				const [re, _, _hasMagic, uflag] = p.toRegExpSource(dot);
++				this.#uflag = this.#uflag || uflag;
++				return re;
++			})
++				.filter(p => !(this.isStart() && this.isEnd()) || !!p)
++				.join('|');
++		}
++		static #parseGlob(glob, hasMagic, noEmpty = false) {
++			let escaping = false;
++			let re = '';
++			let uflag = false;
++			for (let i = 0; i < glob.length; i++) {
++				const c = glob.charAt(i);
++				if (escaping) {
++					escaping = false;
++					re += (reSpecials.has(c) ? '\\' : '') + c;
++					continue;
++				}
++				if (c === '\\') {
++					if (i === glob.length - 1) {
++						re += '\\\\';
++					}
++					else {
++						escaping = true;
++					}
++					continue;
++				}
++				if (c === '[') {
++					const [src, needUflag, consumed, magic] = (0, brace_expressions_js_1.parseClass)(glob, i);
++					if (consumed) {
++						re += src;
++						uflag = uflag || needUflag;
++						i += consumed - 1;
++						hasMagic = hasMagic || magic;
++						continue;
++					}
++				}
++				if (c === '*') {
++					if (noEmpty && glob === '*')
++						re += starNoEmpty;
++					else
++						re += star;
++					hasMagic = true;
++					continue;
++				}
++				if (c === '?') {
++					re += qmark;
++					hasMagic = true;
++					continue;
++				}
++				re += regExpEscape(c);
++			}
++			return [re, (0, unescape_js_1.unescape)(glob), !!hasMagic, uflag];
++		}
++	}
++	exports.AST = AST;
++	//# sourceMappingURL=ast.js.map
++
++	/***/ }),
++	/* 11 */
++	/***/ ((__unused_webpack_module, exports) => {
++
++	"use strict";
++
++	// translate the various posix character classes into unicode properties
++	// this works across all unicode locales
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.parseClass = void 0;
++	// { : [, /u flag required, negated]
++	const posixClasses = {
++		'[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
++		'[:alpha:]': ['\\p{L}\\p{Nl}', true],
++		'[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
++		'[:blank:]': ['\\p{Zs}\\t', true],
++		'[:cntrl:]': ['\\p{Cc}', true],
++		'[:digit:]': ['\\p{Nd}', true],
++		'[:graph:]': ['\\p{Z}\\p{C}', true, true],
++		'[:lower:]': ['\\p{Ll}', true],
++		'[:print:]': ['\\p{C}', true],
++		'[:punct:]': ['\\p{P}', true],
++		'[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
++		'[:upper:]': ['\\p{Lu}', true],
++		'[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
++		'[:xdigit:]': ['A-Fa-f0-9', false],
++	};
++	// only need to escape a few things inside of brace expressions
++	// escapes: [ \ ] -
++	const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
++	// escape all regexp magic characters
++	const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
++	// everything has already been escaped, we just have to join
++	const rangesToString = (ranges) => ranges.join('');
++	// takes a glob string at a posix brace expression, and returns
++	// an equivalent regular expression source, and boolean indicating
++	// whether the /u flag needs to be applied, and the number of chars
++	// consumed to parse the character class.
++	// This also removes out of order ranges, and returns ($.) if the
++	// entire class just no good.
++	const parseClass = (glob, position) => {
++		const pos = position;
++		/* c8 ignore start */
++		if (glob.charAt(pos) !== '[') {
++			throw new Error('not in a brace expression');
++		}
++		/* c8 ignore stop */
++		const ranges = [];
++		const negs = [];
++		let i = pos + 1;
++		let sawStart = false;
++		let uflag = false;
++		let escaping = false;
++		let negate = false;
++		let endPos = pos;
++		let rangeStart = '';
++		WHILE: while (i < glob.length) {
++			const c = glob.charAt(i);
++			if ((c === '!' || c === '^') && i === pos + 1) {
++				negate = true;
++				i++;
++				continue;
++			}
++			if (c === ']' && sawStart && !escaping) {
++				endPos = i + 1;
++				break;
++			}
++			sawStart = true;
++			if (c === '\\') {
++				if (!escaping) {
++					escaping = true;
++					i++;
++					continue;
++				}
++				// escaped \ char, fall through and treat like normal char
++			}
++			if (c === '[' && !escaping) {
++				// either a posix class, a collation equivalent, or just a [
++				for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
++					if (glob.startsWith(cls, i)) {
++						// invalid, [a-[] is fine, but not [a-[:alpha]]
++						if (rangeStart) {
++							return ['$.', false, glob.length - pos, true];
++						}
++						i += cls.length;
++						if (neg)
++							negs.push(unip);
++						else
++							ranges.push(unip);
++						uflag = uflag || u;
++						continue WHILE;
++					}
++				}
++			}
++			// now it's just a normal character, effectively
++			escaping = false;
++			if (rangeStart) {
++				// throw this range away if it's not valid, but others
++				// can still match.
++				if (c > rangeStart) {
++					ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
++				}
++				else if (c === rangeStart) {
++					ranges.push(braceEscape(c));
++				}
++				rangeStart = '';
++				i++;
++				continue;
++			}
++			// now might be the start of a range.
++			// can be either c-d or c-] or c] or c] at this point
++			if (glob.startsWith('-]', i + 1)) {
++				ranges.push(braceEscape(c + '-'));
++				i += 2;
++				continue;
++			}
++			if (glob.startsWith('-', i + 1)) {
++				rangeStart = c;
++				i += 2;
++				continue;
++			}
++			// not the start of a range, just a single character
++			ranges.push(braceEscape(c));
++			i++;
++		}
++		if (endPos < i) {
++			// didn't see the end of the class, not a valid class,
++			// but might still be valid as a literal match.
++			return ['', false, 0, false];
++		}
++		// if we got no ranges and no negates, then we have a range that
++		// cannot possibly match anything, and that poisons the whole glob
++		if (!ranges.length && !negs.length) {
++			return ['$.', false, glob.length - pos, true];
++		}
++		// if we got one positive range, and it's a single character, then that's
++		// not actually a magic pattern, it's just that one literal character.
++		// we should not treat that as "magic", we should just return the literal
++		// character. [_] is a perfectly valid way to escape glob magic chars.
++		if (negs.length === 0 &&
++			ranges.length === 1 &&
++			/^\\?.$/.test(ranges[0]) &&
++			!negate) {
++			const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
++			return [regexpEscape(r), false, endPos - pos, false];
++		}
++		const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
++		const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
++		const comb = ranges.length && negs.length
++			? '(' + sranges + '|' + snegs + ')'
++			: ranges.length
++				? sranges
++				: snegs;
++		return [comb, uflag, endPos - pos, true];
++	};
++	exports.parseClass = parseClass;
++	//# sourceMappingURL=brace-expressions.js.map
++
++	/***/ }),
++	/* 12 */
++	/***/ ((__unused_webpack_module, exports) => {
++
++	"use strict";
++
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.unescape = void 0;
++	/**
++	 * Un-escape a string that has been escaped with {@link escape}.
++	 *
++	 * If the {@link windowsPathsNoEscape} option is used, then square-brace
++	 * escapes are removed, but not backslash escapes.  For example, it will turn
++	 * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
++	 * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
++	 *
++	 * When `windowsPathsNoEscape` is not set, then both brace escapes and
++	 * backslash escapes are removed.
++	 *
++	 * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
++	 * or unescaped.
++	 */
++	const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
++		return windowsPathsNoEscape
++			? s.replace(/\[([^\/\\])\]/g, '$1')
++			: s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
++	};
++	exports.unescape = unescape;
++	//# sourceMappingURL=unescape.js.map
++
++	/***/ }),
++	/* 13 */
++	/***/ ((__unused_webpack_module, exports) => {
++
++	"use strict";
++
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.escape = void 0;
++	/**
++	 * Escape all magic characters in a glob pattern.
++	 *
++	 * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
++	 * option is used, then characters are escaped by wrapping in `[]`, because
++	 * a magic character wrapped in a character class can only be satisfied by
++	 * that exact character.  In this mode, `\` is _not_ escaped, because it is
++	 * not interpreted as a magic character, but instead as a path separator.
++	 */
++	const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
++		// don't need to escape +@! because we escape the parens
++		// that make those magic, and escaping ! as [!] isn't valid,
++		// because [!]] is a valid glob class meaning not ']'.
++		return windowsPathsNoEscape
++			? s.replace(/[?*()[\]]/g, '[$&]')
++			: s.replace(/[?*()[\]\\]/g, '\\$&');
++	};
++	exports.escape = escape;
++	//# sourceMappingURL=escape.js.map
++
++	/***/ })
++	/******/ 	]);
++	/************************************************************************/
++	/******/ 	// The module cache
++	/******/ 	var __webpack_module_cache__ = {};
++	/******/
++	/******/ 	// The require function
++	/******/ 	function __webpack_require__(moduleId) {
++	/******/ 		// Check if module is in cache
++	/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
++	/******/ 		if (cachedModule !== undefined) {
++	/******/ 			return cachedModule.exports;
++	/******/ 		}
++	/******/ 		// Create a new module (and put it into the cache)
++	/******/ 		var module = __webpack_module_cache__[moduleId] = {
++	/******/ 			// no module.id needed
++	/******/ 			// no module.loaded needed
++	/******/ 			exports: {}
++	/******/ 		};
++	/******/
++	/******/ 		// Execute the module function
++	/******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
++	/******/
++	/******/ 		// Return the exports of the module
++	/******/ 		return module.exports;
++	/******/ 	}
++	/******/
++	/************************************************************************/
++	var __webpack_exports__ = {};
++	// This entry need to be wrapped in an IIFE because it need to be in strict mode.
++	(() => {
++	"use strict";
++	var exports = __webpack_exports__;
++
++	/*---------------------------------------------------------------------------------------------
++	 *  Copyright (c) Microsoft Corporation. All rights reserved.
++	 *  Licensed under the MIT License. See License.txt in the project root for license information.
++	 *--------------------------------------------------------------------------------------------*/
++	Object.defineProperty(exports, "__esModule", ({ value: true }));
++	exports.activate = void 0;
++	const request_light_1 = __webpack_require__(1);
++	const vscode_1 = __webpack_require__(2);
++	const fsProvider_1 = __webpack_require__(3);
++	const SCHEME = 'vscode-test-web';
++	function activate(context) {
++		const serverUri = context.extensionUri.with({ path: '/static/mount', query: undefined });
++		const serverBackedRootDirectory = new ServerBackedDirectory(serverUri, [], '');
++		const memFsProvider = new fsProvider_1.MemFileSystemProvider(SCHEME, serverBackedRootDirectory, context.extensionUri);
++		const disposable = vscode_1.workspace.registerFileSystemProvider(SCHEME, memFsProvider);
++		context.subscriptions.push(disposable);
++		const searchDisposable = vscode_1.workspace.registerFileSearchProvider(SCHEME, memFsProvider);
++		context.subscriptions.push(searchDisposable);
++		console.log(`vscode-test-web-support fs provider registers for ${SCHEME}, initial content from ${serverUri.toString(/*skipEncoding*/ true)}`);
++	}
++	exports.activate = activate;
++	class ServerBackedFile {
++		constructor(_serverRoot, pathSegments, name) {
++			this._serverRoot = _serverRoot;
++			this.pathSegments = pathSegments;
++			this.name = name;
++			this.type = vscode_1.FileType.File;
++		}
++		get stats() {
++			if (this._stats === undefined) {
++				this._stats = getStats(this._serverRoot, this.pathSegments);
++			}
++			return this._stats;
++		}
++		set stats(stats) {
++			this._stats = stats;
++		}
++		get content() {
++			if (this._content === undefined) {
++				this._content = getContent(this._serverRoot, this.pathSegments);
++			}
++			return this._content;
++		}
++		set content(content) {
++			this._content = content;
++		}
++	}
++	class ServerBackedDirectory {
++		constructor(_serverRoot, pathSegments, name) {
++			this._serverRoot = _serverRoot;
++			this.pathSegments = pathSegments;
++			this.name = name;
++			this.type = vscode_1.FileType.Directory;
++		}
++		get stats() {
++			if (this._stats === undefined) {
++				this._stats = getStats(this._serverRoot, this.pathSegments);
++			}
++			return this._stats;
++		}
++		set stats(stats) {
++			this._stats = stats;
++		}
++		get entries() {
++			if (this._entries === undefined) {
++				this._entries = getEntries(this._serverRoot, this.pathSegments);
++			}
++			return this._entries;
++		}
++		set entries(entries) {
++			this._entries = entries;
++		}
++	}
++	// eslint-disable-next-line @typescript-eslint/no-explicit-any
++	function isEntry(e) {
++		return e && (e.type === vscode_1.FileType.Directory || e.type === vscode_1.FileType.File) && typeof e.name === 'string' && e.name.length > 0;
++	}
++	// eslint-disable-next-line @typescript-eslint/no-explicit-any
++	function isStat(e) {
++		return e && (e.type === vscode_1.FileType.Directory || e.type === vscode_1.FileType.File) && typeof e.ctime === 'number' && typeof e.mtime === 'number' && typeof e.size === 'number';
++	}
++	function getServerUri(serverRoot, pathSegments) {
++		return vscode_1.Uri.joinPath(serverRoot, ...pathSegments);
++	}
++	async function getEntries(serverRoot, pathSegments) {
++		const url = getServerUri(serverRoot, pathSegments).with({ query: 'readdir' }).toString(/*skipEncoding*/ true);
++		const response = await (0, request_light_1.xhr)({ url });
++		if (response.status === 200 && response.status <= 204) {
++			try {
++				const res = JSON.parse(response.responseText);
++				if (Array.isArray(res)) {
++					const entries = new Map();
++					for (const r of res) {
++						if (isEntry(r)) {
++							const newPathSegments = [...pathSegments, encodeURIComponent(r.name)];
++							const newEntry = r.type === vscode_1.FileType.Directory ? new ServerBackedDirectory(serverRoot, newPathSegments, r.name) : new ServerBackedFile(serverRoot, newPathSegments, r.name);
++							entries.set(newEntry.name, newEntry);
++						}
++					}
++					return entries;
++				}
++			}
++			catch {
++				// ignore
++			}
++			console.log(`Invalid server response format for ${url}.`);
++		}
++		else {
++			console.log(`Invalid server response for ${url}. Status ${response.status}`);
++		}
++		return new Map();
++	}
++	async function getStats(serverRoot, pathSegments) {
++		const serverUri = getServerUri(serverRoot, pathSegments);
++		const url = serverUri.with({ query: 'stat' }).toString(/*skipEncoding*/ true);
++		const response = await (0, request_light_1.xhr)({ url });
++		if (response.status === 200 && response.status <= 204) {
++			const res = JSON.parse(response.responseText);
++			if (isStat(res)) {
++				return res;
++			}
++			throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}.`);
++		}
++		throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}. Status ${response.status}.`);
++	}
++	async function getContent(serverRoot, pathSegments) {
++		const serverUri = getServerUri(serverRoot, pathSegments);
++		const response = await (0, request_light_1.xhr)({ url: serverUri.toString(/*skipEncoding*/ true) });
++		if (response.status >= 200 && response.status <= 204) {
++			return response.body;
++		}
++		throw vscode_1.FileSystemError.FileNotFound(`Invalid server response for ${serverUri.toString(/*skipEncoding*/ true)}. Status ${response.status}.`);
++	}
++
++	})();
++
++	var __webpack_export_target__ = exports;
++	for(var i in __webpack_exports__) __webpack_export_target__[i] = __webpack_exports__[i];
++	if(__webpack_exports__.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });
++	/******/ })()
++	;
++	//# sourceMappingURL=fsExtensionMain.js.map
+diff --git a/node_modules/@vscode/test-web/fs-provider/package-lock.json b/node_modules/@vscode/test-web/fs-provider/package-lock.json
+index 09090b6..7177965 100644
+--- a/node_modules/@vscode/test-web/fs-provider/package-lock.json
++++ b/node_modules/@vscode/test-web/fs-provider/package-lock.json
+@@ -1,1736 +1,1766 @@
+ {
+-	"name": "vscode-test-web-fs",
+-	"version": "0.0.1",
+-	"lockfileVersion": 3,
+-	"requires": true,
+-	"packages": {
+-		"": {
+-			"name": "vscode-test-web-fs",
+-			"version": "0.0.1",
+-			"license": "MIT",
+-			"devDependencies": {
+-				"@types/vscode": "^1.81.0",
+-				"@types/webpack-env": "^1.18.3",
+-				"path-browserify": "^1.0.1",
+-				"process": "^0.11.10",
+-				"request-light": "^0.7.0",
+-				"ts-loader": "^9.5.0",
+-				"vscode-uri": "^3.0.8",
+-				"webpack": "^5.89.0",
+-				"webpack-cli": "^5.1.4"
+-			},
+-			"engines": {
+-				"vscode": "^1.72.0"
+-			}
+-		},
+-		"node_modules/@discoveryjs/json-ext": {
+-			"version": "0.5.3",
+-			"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
+-			"integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=10.0.0"
+-			}
+-		},
+-		"node_modules/@jridgewell/gen-mapping": {
+-			"version": "0.3.2",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+-			"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@jridgewell/set-array": "^1.0.1",
+-				"@jridgewell/sourcemap-codec": "^1.4.10",
+-				"@jridgewell/trace-mapping": "^0.3.9"
+-			},
+-			"engines": {
+-				"node": ">=6.0.0"
+-			}
+-		},
+-		"node_modules/@jridgewell/resolve-uri": {
+-			"version": "3.1.0",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+-			"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6.0.0"
+-			}
+-		},
+-		"node_modules/@jridgewell/set-array": {
+-			"version": "1.1.2",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+-			"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6.0.0"
+-			}
+-		},
+-		"node_modules/@jridgewell/source-map": {
+-			"version": "0.3.3",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
+-			"integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@jridgewell/gen-mapping": "^0.3.0",
+-				"@jridgewell/trace-mapping": "^0.3.9"
+-			}
+-		},
+-		"node_modules/@jridgewell/sourcemap-codec": {
+-			"version": "1.4.14",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+-			"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/@jridgewell/trace-mapping": {
+-			"version": "0.3.14",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
+-			"integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@jridgewell/resolve-uri": "^3.0.3",
+-				"@jridgewell/sourcemap-codec": "^1.4.10"
+-			}
+-		},
+-		"node_modules/@types/eslint": {
+-			"version": "7.28.0",
+-			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz",
+-			"integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@types/estree": "*",
+-				"@types/json-schema": "*"
+-			}
+-		},
+-		"node_modules/@types/eslint-scope": {
+-			"version": "3.7.3",
+-			"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+-			"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@types/eslint": "*",
+-				"@types/estree": "*"
+-			}
+-		},
+-		"node_modules/@types/estree": {
+-			"version": "0.0.51",
+-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+-			"integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/@types/json-schema": {
+-			"version": "7.0.9",
+-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+-			"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/@types/node": {
+-			"version": "16.9.1",
+-			"resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz",
+-			"integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/@types/vscode": {
+-			"version": "1.81.0",
+-			"resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz",
+-			"integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/@types/webpack-env": {
+-			"version": "1.18.3",
+-			"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.3.tgz",
+-			"integrity": "sha512-v4CH6FLBCftYGFAswDhzFLjKgucXsOkIf5Mzl8ZZhEtC6oye9whFInNPKszNB9AvX7JEZMtpXxWctih6addP+Q==",
+-			"dev": true
+-		},
+-		"node_modules/@webassemblyjs/ast": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+-			"integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+-			"dev": true,
+-			"license": "MIT",
+-			"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,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/@webassemblyjs/helper-buffer": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+-			"integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT",
+-			"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/@webassemblyjs/helper-wasm-section": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+-			"integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@webassemblyjs/helper-buffer": "1.11.6",
+-				"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+-				"@webassemblyjs/wasm-gen": "1.11.6"
+-			}
+-		},
+-		"node_modules/@webassemblyjs/ieee754": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+-			"integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+-			"dev": true,
+-			"license": "MIT",
+-			"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,
+-			"license": "Apache-2.0",
+-			"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/@webassemblyjs/wasm-edit": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+-			"integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@webassemblyjs/helper-buffer": "1.11.6",
+-				"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+-				"@webassemblyjs/helper-wasm-section": "1.11.6",
+-				"@webassemblyjs/wasm-gen": "1.11.6",
+-				"@webassemblyjs/wasm-opt": "1.11.6",
+-				"@webassemblyjs/wasm-parser": "1.11.6",
+-				"@webassemblyjs/wast-printer": "1.11.6"
+-			}
+-		},
+-		"node_modules/@webassemblyjs/wasm-gen": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+-			"integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+-				"@webassemblyjs/ieee754": "1.11.6",
+-				"@webassemblyjs/leb128": "1.11.6",
+-				"@webassemblyjs/utf8": "1.11.6"
+-			}
+-		},
+-		"node_modules/@webassemblyjs/wasm-opt": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+-			"integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@webassemblyjs/helper-buffer": "1.11.6",
+-				"@webassemblyjs/wasm-gen": "1.11.6",
+-				"@webassemblyjs/wasm-parser": "1.11.6"
+-			}
+-		},
+-		"node_modules/@webassemblyjs/wasm-parser": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+-			"integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@webassemblyjs/helper-api-error": "1.11.6",
+-				"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+-				"@webassemblyjs/ieee754": "1.11.6",
+-				"@webassemblyjs/leb128": "1.11.6",
+-				"@webassemblyjs/utf8": "1.11.6"
+-			}
+-		},
+-		"node_modules/@webassemblyjs/wast-printer": {
+-			"version": "1.11.6",
+-			"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+-			"integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@webassemblyjs/ast": "1.11.6",
+-				"@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,
+-			"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",
+-			"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+-			"integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+-			"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",
+-			"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+-			"integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+-			"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",
+-			"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+-			"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+-			"dev": true,
+-			"license": "BSD-3-Clause"
+-		},
+-		"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,
+-			"license": "Apache-2.0"
+-		},
+-		"node_modules/acorn": {
+-			"version": "8.8.0",
+-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
+-			"integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+-			"dev": true,
+-			"license": "MIT",
+-			"bin": {
+-				"acorn": "bin/acorn"
+-			},
+-			"engines": {
+-				"node": ">=0.4.0"
+-			}
+-		},
+-		"node_modules/acorn-import-assertions": {
+-			"version": "1.9.0",
+-			"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+-			"integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"peerDependencies": {
+-				"acorn": "^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==",
+-			"dev": true,
+-			"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",
+-			"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+-			"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"peerDependencies": {
+-				"ajv": "^6.9.1"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"color-convert": "^2.0.1"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			},
+-			"funding": {
+-				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+-			}
+-		},
+-		"node_modules/braces": {
+-			"version": "3.0.2",
+-			"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+-			"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"fill-range": "^7.0.1"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/browserslist": {
+-			"version": "4.17.0",
+-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz",
+-			"integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"caniuse-lite": "^1.0.30001254",
+-				"colorette": "^1.3.0",
+-				"electron-to-chromium": "^1.3.830",
+-				"escalade": "^3.1.1",
+-				"node-releases": "^1.1.75"
+-			},
+-			"bin": {
+-				"browserslist": "cli.js"
+-			},
+-			"engines": {
+-				"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+-			},
+-			"funding": {
+-				"type": "opencollective",
+-				"url": "https://opencollective.com/browserslist"
+-			}
+-		},
+-		"node_modules/browserslist/node_modules/colorette": {
+-			"version": "1.4.0",
+-			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+-			"integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/caniuse-lite": {
+-			"version": "1.0.30001257",
+-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz",
+-			"integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==",
+-			"dev": true,
+-			"license": "CC-BY-4.0",
+-			"funding": {
+-				"type": "opencollective",
+-				"url": "https://opencollective.com/browserslist"
+-			}
+-		},
+-		"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,
+-			"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/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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6.0"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"is-plain-object": "^2.0.4",
+-				"kind-of": "^6.0.2",
+-				"shallow-clone": "^3.0.0"
+-			},
+-			"engines": {
+-				"node": ">=6"
+-			}
+-		},
+-		"node_modules/color-convert": {
+-			"version": "2.0.1",
+-			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+-			"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"color-name": "~1.1.4"
+-			},
+-			"engines": {
+-				"node": ">=7.0.0"
+-			}
+-		},
+-		"node_modules/color-name": {
+-			"version": "1.1.4",
+-			"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+-			"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/colorette": {
+-			"version": "2.0.16",
+-			"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+-			"integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=14"
+-			}
+-		},
+-		"node_modules/cross-spawn": {
+-			"version": "7.0.3",
+-			"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+-			"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"path-key": "^3.1.0",
+-				"shebang-command": "^2.0.0",
+-				"which": "^2.0.1"
+-			},
+-			"engines": {
+-				"node": ">= 8"
+-			}
+-		},
+-		"node_modules/electron-to-chromium": {
+-			"version": "1.3.836",
+-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz",
+-			"integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==",
+-			"dev": true,
+-			"license": "ISC"
+-		},
+-		"node_modules/enhanced-resolve": {
+-			"version": "5.10.0",
+-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
+-			"integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"graceful-fs": "^4.2.4",
+-				"tapable": "^2.2.0"
+-			},
+-			"engines": {
+-				"node": ">=10.13.0"
+-			}
+-		},
+-		"node_modules/envinfo": {
+-			"version": "7.8.1",
+-			"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+-			"integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"bin": {
+-				"envinfo": "dist/cli.js"
+-			},
+-			"engines": {
+-				"node": ">=4"
+-			}
+-		},
+-		"node_modules/es-module-lexer": {
+-			"version": "1.2.1",
+-			"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz",
+-			"integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/escalade": {
+-			"version": "3.1.1",
+-			"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+-			"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6"
+-			}
+-		},
+-		"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,
+-			"license": "BSD-2-Clause",
+-			"dependencies": {
+-				"esrecurse": "^4.3.0",
+-				"estraverse": "^4.1.1"
+-			},
+-			"engines": {
+-				"node": ">=8.0.0"
+-			}
+-		},
+-		"node_modules/esrecurse": {
+-			"version": "4.3.0",
+-			"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+-			"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+-			"dev": true,
+-			"license": "BSD-2-Clause",
+-			"dependencies": {
+-				"estraverse": "^5.2.0"
+-			},
+-			"engines": {
+-				"node": ">=4.0"
+-			}
+-		},
+-		"node_modules/esrecurse/node_modules/estraverse": {
+-			"version": "5.2.0",
+-			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+-			"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+-			"dev": true,
+-			"license": "BSD-2-Clause",
+-			"engines": {
+-				"node": ">=4.0"
+-			}
+-		},
+-		"node_modules/estraverse": {
+-			"version": "4.3.0",
+-			"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+-			"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+-			"dev": true,
+-			"license": "BSD-2-Clause",
+-			"engines": {
+-				"node": ">=4.0"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=0.8.x"
+-			}
+-		},
+-		"node_modules/fast-deep-equal": {
+-			"version": "3.1.3",
+-			"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+-			"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/fast-json-stable-stringify": {
+-			"version": "2.1.0",
+-			"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+-			"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/fastest-levenshtein": {
+-			"version": "1.0.12",
+-			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+-			"integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/fill-range": {
+-			"version": "7.0.1",
+-			"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+-			"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"to-regex-range": "^5.0.1"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"locate-path": "^5.0.0",
+-				"path-exists": "^4.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/function-bind": {
+-			"version": "1.1.1",
+-			"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+-			"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "BSD-2-Clause"
+-		},
+-		"node_modules/graceful-fs": {
+-			"version": "4.2.9",
+-			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+-			"integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+-			"dev": true,
+-			"license": "ISC"
+-		},
+-		"node_modules/has": {
+-			"version": "1.0.3",
+-			"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+-			"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"function-bind": "^1.1.1"
+-			},
+-			"engines": {
+-				"node": ">= 0.4.0"
+-			}
+-		},
+-		"node_modules/has-flag": {
+-			"version": "4.0.0",
+-			"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+-			"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/import-local": {
+-			"version": "3.0.2",
+-			"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+-			"integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+-			"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"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=10.13.0"
+-			}
+-		},
+-		"node_modules/is-core-module": {
+-			"version": "2.11.0",
+-			"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+-			"integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"has": "^1.0.3"
+-			},
+-			"funding": {
+-				"url": "https://github.com/sponsors/ljharb"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=0.12.0"
+-			}
+-		},
+-		"node_modules/is-plain-object": {
+-			"version": "2.0.4",
+-			"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+-			"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"isobject": "^3.0.1"
+-			},
+-			"engines": {
+-				"node": ">=0.10.0"
+-			}
+-		},
+-		"node_modules/isexe": {
+-			"version": "2.0.0",
+-			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+-			"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+-			"dev": true,
+-			"license": "ISC"
+-		},
+-		"node_modules/isobject": {
+-			"version": "3.0.1",
+-			"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+-			"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=0.10.0"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@types/node": "*",
+-				"merge-stream": "^2.0.0",
+-				"supports-color": "^8.0.0"
+-			},
+-			"engines": {
+-				"node": ">= 10.13.0"
+-			}
+-		},
+-		"node_modules/jest-worker/node_modules/supports-color": {
+-			"version": "8.1.1",
+-			"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+-			"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+-			"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/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,
+-			"license": "MIT"
+-		},
+-		"node_modules/json-schema-traverse": {
+-			"version": "0.4.1",
+-			"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+-			"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=0.10.0"
+-			}
+-		},
+-		"node_modules/loader-runner": {
+-			"version": "4.2.0",
+-			"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+-			"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6.11.5"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"p-locate": "^4.1.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/lru-cache": {
+-			"version": "6.0.0",
+-			"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+-			"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+-			"dev": true,
+-			"license": "ISC",
+-			"dependencies": {
+-				"yallist": "^4.0.0"
+-			},
+-			"engines": {
+-				"node": ">=10"
+-			}
+-		},
+-		"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/micromatch": {
+-			"version": "4.0.4",
+-			"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+-			"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"braces": "^3.0.1",
+-				"picomatch": "^2.2.3"
+-			},
+-			"engines": {
+-				"node": ">=8.6"
+-			}
+-		},
+-		"node_modules/mime-db": {
+-			"version": "1.49.0",
+-			"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
+-			"integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">= 0.6"
+-			}
+-		},
+-		"node_modules/mime-types": {
+-			"version": "2.1.32",
+-			"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
+-			"integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"mime-db": "1.49.0"
+-			},
+-			"engines": {
+-				"node": ">= 0.6"
+-			}
+-		},
+-		"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/node-releases": {
+-			"version": "1.1.75",
+-			"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
+-			"integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"p-try": "^2.0.0"
+-			},
+-			"engines": {
+-				"node": ">=6"
+-			},
+-			"funding": {
+-				"url": "https://github.com/sponsors/sindresorhus"
+-			}
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"p-limit": "^2.2.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6"
+-			}
+-		},
+-		"node_modules/path-browserify": {
+-			"version": "1.0.1",
+-			"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
+-			"integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/path-key": {
+-			"version": "3.1.1",
+-			"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+-			"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+-			"dev": true,
+-			"license": "MIT",
+-			"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,
+-			"license": "MIT"
+-		},
+-		"node_modules/picomatch": {
+-			"version": "2.3.0",
+-			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+-			"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=8.6"
+-			},
+-			"funding": {
+-				"url": "https://github.com/sponsors/jonschlinkert"
+-			}
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"find-up": "^4.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/process": {
+-			"version": "0.11.10",
+-			"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+-			"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">= 0.6.0"
+-			}
+-		},
+-		"node_modules/punycode": {
+-			"version": "2.1.1",
+-			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+-			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6"
+-			}
+-		},
+-		"node_modules/randombytes": {
+-			"version": "2.1.0",
+-			"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+-			"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"safe-buffer": "^5.1.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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"resolve": "^1.20.0"
+-			},
+-			"engines": {
+-				"node": ">= 10.13.0"
+-			}
+-		},
+-		"node_modules/request-light": {
+-			"version": "0.7.0",
+-			"resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz",
+-			"integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/resolve": {
+-			"version": "1.22.1",
+-			"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+-			"integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"is-core-module": "^2.9.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-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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"resolve-from": "^5.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"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==",
+-			"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/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,
+-			"license": "MIT",
+-			"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",
+-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+-			"dev": true,
+-			"license": "ISC",
+-			"dependencies": {
+-				"lru-cache": "^6.0.0"
+-			},
+-			"bin": {
+-				"semver": "bin/semver.js"
+-			},
+-			"engines": {
+-				"node": ">=10"
+-			}
+-		},
+-		"node_modules/serialize-javascript": {
+-			"version": "6.0.1",
+-			"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+-			"integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+-			"dev": true,
+-			"license": "BSD-3-Clause",
+-			"dependencies": {
+-				"randombytes": "^2.1.0"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"kind-of": "^6.0.2"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/shebang-command": {
+-			"version": "2.0.0",
+-			"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+-			"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"shebang-regex": "^3.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/shebang-regex": {
+-			"version": "3.0.0",
+-			"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+-			"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"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==",
+-			"dev": true,
+-			"license": "BSD-3-Clause",
+-			"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==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"buffer-from": "^1.0.0",
+-				"source-map": "^0.6.0"
+-			}
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"has-flag": "^4.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8"
+-			}
+-		},
+-		"node_modules/supports-preserve-symlinks-flag": {
+-			"version": "1.0.0",
+-			"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+-			"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">= 0.4"
+-			},
+-			"funding": {
+-				"url": "https://github.com/sponsors/ljharb"
+-			}
+-		},
+-		"node_modules/tapable": {
+-			"version": "2.2.1",
+-			"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+-			"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=6"
+-			}
+-		},
+-		"node_modules/terser": {
+-			"version": "5.17.7",
+-			"resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz",
+-			"integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==",
+-			"dev": true,
+-			"license": "BSD-2-Clause",
+-			"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.9",
+-			"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+-			"integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@jridgewell/trace-mapping": "^0.3.17",
+-				"jest-worker": "^27.4.5",
+-				"schema-utils": "^3.1.1",
+-				"serialize-javascript": "^6.0.1",
+-				"terser": "^5.16.8"
+-			},
+-			"engines": {
+-				"node": ">= 10.13.0"
+-			},
+-			"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-webpack-plugin/node_modules/@jridgewell/trace-mapping": {
+-			"version": "0.3.18",
+-			"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+-			"integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"@jridgewell/resolve-uri": "3.1.0",
+-				"@jridgewell/sourcemap-codec": "1.4.14"
+-			}
+-		},
+-		"node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+-			"version": "3.1.1",
+-			"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+-			"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"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/terser/node_modules/acorn": {
+-			"version": "8.8.2",
+-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+-			"integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+-			"dev": true,
+-			"license": "MIT",
+-			"bin": {
+-				"acorn": "bin/acorn"
+-			},
+-			"engines": {
+-				"node": ">=0.4.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,
+-			"license": "MIT"
+-		},
+-		"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,
+-			"license": "MIT",
+-			"dependencies": {
+-				"is-number": "^7.0.0"
+-			},
+-			"engines": {
+-				"node": ">=8.0"
+-			}
+-		},
+-		"node_modules/ts-loader": {
+-			"version": "9.5.0",
+-			"resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz",
+-			"integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==",
+-			"dev": true,
+-			"dependencies": {
+-				"chalk": "^4.1.0",
+-				"enhanced-resolve": "^5.0.0",
+-				"micromatch": "^4.0.0",
+-				"semver": "^7.3.4",
+-				"source-map": "^0.7.4"
+-			},
+-			"engines": {
+-				"node": ">=12.0.0"
+-			},
+-			"peerDependencies": {
+-				"typescript": "*",
+-				"webpack": "^5.0.0"
+-			}
+-		},
+-		"node_modules/ts-loader/node_modules/source-map": {
+-			"version": "0.7.4",
+-			"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+-			"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+-			"dev": true,
+-			"engines": {
+-				"node": ">= 8"
+-			}
+-		},
+-		"node_modules/typescript": {
+-			"version": "5.2.2",
+-			"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
+-			"integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
+-			"dev": true,
+-			"peer": true,
+-			"bin": {
+-				"tsc": "bin/tsc",
+-				"tsserver": "bin/tsserver"
+-			},
+-			"engines": {
+-				"node": ">=14.17"
+-			}
+-		},
+-		"node_modules/uri-js": {
+-			"version": "4.4.1",
+-			"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+-			"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+-			"dev": true,
+-			"license": "BSD-2-Clause",
+-			"dependencies": {
+-				"punycode": "^2.1.0"
+-			}
+-		},
+-		"node_modules/vscode-uri": {
+-			"version": "3.0.8",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/watchpack": {
+-			"version": "2.4.0",
+-			"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+-			"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"glob-to-regexp": "^0.4.1",
+-				"graceful-fs": "^4.1.2"
+-			},
+-			"engines": {
+-				"node": ">=10.13.0"
+-			}
+-		},
+-		"node_modules/webpack": {
+-			"version": "5.89.0",
+-			"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
+-			"integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+-			"dev": true,
+-			"dependencies": {
+-				"@types/eslint-scope": "^3.7.3",
+-				"@types/estree": "^1.0.0",
+-				"@webassemblyjs/ast": "^1.11.5",
+-				"@webassemblyjs/wasm-edit": "^1.11.5",
+-				"@webassemblyjs/wasm-parser": "^1.11.5",
+-				"acorn": "^8.7.1",
+-				"acorn-import-assertions": "^1.9.0",
+-				"browserslist": "^4.14.5",
+-				"chrome-trace-event": "^1.0.2",
+-				"enhanced-resolve": "^5.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.7",
+-				"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-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,
+-			"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-merge": {
+-			"version": "5.8.0",
+-			"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+-			"integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"clone-deep": "^4.0.1",
+-				"wildcard": "^2.0.0"
+-			},
+-			"engines": {
+-				"node": ">=10.0.0"
+-			}
+-		},
+-		"node_modules/webpack-sources": {
+-			"version": "3.2.3",
+-			"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+-			"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+-			"dev": true,
+-			"license": "MIT",
+-			"engines": {
+-				"node": ">=10.13.0"
+-			}
+-		},
+-		"node_modules/webpack/node_modules/@types/estree": {
+-			"version": "1.0.1",
+-			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
+-			"integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/webpack/node_modules/enhanced-resolve": {
+-			"version": "5.15.0",
+-			"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+-			"integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+-			"dev": true,
+-			"license": "MIT",
+-			"dependencies": {
+-				"graceful-fs": "^4.2.4",
+-				"tapable": "^2.2.0"
+-			},
+-			"engines": {
+-				"node": ">=10.13.0"
+-			}
+-		},
+-		"node_modules/which": {
+-			"version": "2.0.2",
+-			"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+-			"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+-			"dev": true,
+-			"license": "ISC",
+-			"dependencies": {
+-				"isexe": "^2.0.0"
+-			},
+-			"bin": {
+-				"node-which": "bin/node-which"
+-			},
+-			"engines": {
+-				"node": ">= 8"
+-			}
+-		},
+-		"node_modules/wildcard": {
+-			"version": "2.0.0",
+-			"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+-			"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
+-			"dev": true,
+-			"license": "MIT"
+-		},
+-		"node_modules/yallist": {
+-			"version": "4.0.0",
+-			"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+-			"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+-			"dev": true,
+-			"license": "ISC"
+-		}
+-	}
++  "name": "vscode-test-web-fs",
++  "version": "0.0.1",
++  "lockfileVersion": 3,
++  "requires": true,
++  "packages": {
++    "": {
++      "name": "vscode-test-web-fs",
++      "version": "0.0.1",
++      "license": "MIT",
++      "dependencies": {
++        "minimatch": "^9.0.3"
++      },
++      "devDependencies": {
++        "@types/vscode": "^1.81.0",
++        "@types/webpack-env": "^1.18.3",
++        "path-browserify": "^1.0.1",
++        "process": "^0.11.10",
++        "request-light": "^0.7.0",
++        "ts-loader": "^9.5.0",
++        "vscode-uri": "^3.0.8",
++        "webpack": "^5.89.0",
++        "webpack-cli": "^5.1.4"
++      },
++      "engines": {
++        "vscode": "^1.72.0"
++      }
++    },
++    "node_modules/@discoveryjs/json-ext": {
++      "version": "0.5.3",
++      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
++      "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=10.0.0"
++      }
++    },
++    "node_modules/@jridgewell/gen-mapping": {
++      "version": "0.3.2",
++      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
++      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@jridgewell/set-array": "^1.0.1",
++        "@jridgewell/sourcemap-codec": "^1.4.10",
++        "@jridgewell/trace-mapping": "^0.3.9"
++      },
++      "engines": {
++        "node": ">=6.0.0"
++      }
++    },
++    "node_modules/@jridgewell/resolve-uri": {
++      "version": "3.1.0",
++      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
++      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6.0.0"
++      }
++    },
++    "node_modules/@jridgewell/set-array": {
++      "version": "1.1.2",
++      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
++      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6.0.0"
++      }
++    },
++    "node_modules/@jridgewell/source-map": {
++      "version": "0.3.3",
++      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz",
++      "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@jridgewell/gen-mapping": "^0.3.0",
++        "@jridgewell/trace-mapping": "^0.3.9"
++      }
++    },
++    "node_modules/@jridgewell/sourcemap-codec": {
++      "version": "1.4.14",
++      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
++      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/@jridgewell/trace-mapping": {
++      "version": "0.3.14",
++      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz",
++      "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@jridgewell/resolve-uri": "^3.0.3",
++        "@jridgewell/sourcemap-codec": "^1.4.10"
++      }
++    },
++    "node_modules/@types/eslint": {
++      "version": "7.28.0",
++      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz",
++      "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@types/estree": "*",
++        "@types/json-schema": "*"
++      }
++    },
++    "node_modules/@types/eslint-scope": {
++      "version": "3.7.3",
++      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
++      "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@types/eslint": "*",
++        "@types/estree": "*"
++      }
++    },
++    "node_modules/@types/estree": {
++      "version": "0.0.51",
++      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
++      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/@types/json-schema": {
++      "version": "7.0.9",
++      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
++      "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/@types/node": {
++      "version": "16.9.1",
++      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz",
++      "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/@types/vscode": {
++      "version": "1.81.0",
++      "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.81.0.tgz",
++      "integrity": "sha512-YIaCwpT+O2E7WOMq0eCgBEABE++SX3Yl/O02GoMIF2DO3qAtvw7m6BXFYsxnc6XyzwZgh6/s/UG78LSSombl2w==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/@types/webpack-env": {
++      "version": "1.18.3",
++      "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.3.tgz",
++      "integrity": "sha512-v4CH6FLBCftYGFAswDhzFLjKgucXsOkIf5Mzl8ZZhEtC6oye9whFInNPKszNB9AvX7JEZMtpXxWctih6addP+Q==",
++      "dev": true
++    },
++    "node_modules/@webassemblyjs/ast": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
++      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
++      "dev": true,
++      "license": "MIT",
++      "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,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT"
++    },
++    "node_modules/@webassemblyjs/helper-buffer": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
++      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT",
++      "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,
++      "license": "MIT"
++    },
++    "node_modules/@webassemblyjs/helper-wasm-section": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
++      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@webassemblyjs/helper-buffer": "1.11.6",
++        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
++        "@webassemblyjs/wasm-gen": "1.11.6"
++      }
++    },
++    "node_modules/@webassemblyjs/ieee754": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
++      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
++      "dev": true,
++      "license": "MIT",
++      "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,
++      "license": "Apache-2.0",
++      "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,
++      "license": "MIT"
++    },
++    "node_modules/@webassemblyjs/wasm-edit": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
++      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@webassemblyjs/helper-buffer": "1.11.6",
++        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
++        "@webassemblyjs/helper-wasm-section": "1.11.6",
++        "@webassemblyjs/wasm-gen": "1.11.6",
++        "@webassemblyjs/wasm-opt": "1.11.6",
++        "@webassemblyjs/wasm-parser": "1.11.6",
++        "@webassemblyjs/wast-printer": "1.11.6"
++      }
++    },
++    "node_modules/@webassemblyjs/wasm-gen": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
++      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
++        "@webassemblyjs/ieee754": "1.11.6",
++        "@webassemblyjs/leb128": "1.11.6",
++        "@webassemblyjs/utf8": "1.11.6"
++      }
++    },
++    "node_modules/@webassemblyjs/wasm-opt": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
++      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@webassemblyjs/helper-buffer": "1.11.6",
++        "@webassemblyjs/wasm-gen": "1.11.6",
++        "@webassemblyjs/wasm-parser": "1.11.6"
++      }
++    },
++    "node_modules/@webassemblyjs/wasm-parser": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
++      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@webassemblyjs/helper-api-error": "1.11.6",
++        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
++        "@webassemblyjs/ieee754": "1.11.6",
++        "@webassemblyjs/leb128": "1.11.6",
++        "@webassemblyjs/utf8": "1.11.6"
++      }
++    },
++    "node_modules/@webassemblyjs/wast-printer": {
++      "version": "1.11.6",
++      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
++      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@webassemblyjs/ast": "1.11.6",
++        "@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,
++      "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",
++      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
++      "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
++      "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",
++      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
++      "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
++      "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",
++      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
++      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
++      "dev": true,
++      "license": "BSD-3-Clause"
++    },
++    "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,
++      "license": "Apache-2.0"
++    },
++    "node_modules/acorn": {
++      "version": "8.8.0",
++      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
++      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
++      "dev": true,
++      "license": "MIT",
++      "bin": {
++        "acorn": "bin/acorn"
++      },
++      "engines": {
++        "node": ">=0.4.0"
++      }
++    },
++    "node_modules/acorn-import-assertions": {
++      "version": "1.9.0",
++      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
++      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
++      "dev": true,
++      "license": "MIT",
++      "peerDependencies": {
++        "acorn": "^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==",
++      "dev": true,
++      "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",
++      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
++      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
++      "dev": true,
++      "license": "MIT",
++      "peerDependencies": {
++        "ajv": "^6.9.1"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "color-convert": "^2.0.1"
++      },
++      "engines": {
++        "node": ">=8"
++      },
++      "funding": {
++        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
++      }
++    },
++    "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/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.2",
++      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
++      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "fill-range": "^7.0.1"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/browserslist": {
++      "version": "4.17.0",
++      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz",
++      "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "caniuse-lite": "^1.0.30001254",
++        "colorette": "^1.3.0",
++        "electron-to-chromium": "^1.3.830",
++        "escalade": "^3.1.1",
++        "node-releases": "^1.1.75"
++      },
++      "bin": {
++        "browserslist": "cli.js"
++      },
++      "engines": {
++        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
++      },
++      "funding": {
++        "type": "opencollective",
++        "url": "https://opencollective.com/browserslist"
++      }
++    },
++    "node_modules/browserslist/node_modules/colorette": {
++      "version": "1.4.0",
++      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
++      "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT"
++    },
++    "node_modules/caniuse-lite": {
++      "version": "1.0.30001257",
++      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz",
++      "integrity": "sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==",
++      "dev": true,
++      "license": "CC-BY-4.0",
++      "funding": {
++        "type": "opencollective",
++        "url": "https://opencollective.com/browserslist"
++      }
++    },
++    "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,
++      "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/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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6.0"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "is-plain-object": "^2.0.4",
++        "kind-of": "^6.0.2",
++        "shallow-clone": "^3.0.0"
++      },
++      "engines": {
++        "node": ">=6"
++      }
++    },
++    "node_modules/color-convert": {
++      "version": "2.0.1",
++      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
++      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "color-name": "~1.1.4"
++      },
++      "engines": {
++        "node": ">=7.0.0"
++      }
++    },
++    "node_modules/color-name": {
++      "version": "1.1.4",
++      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
++      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/colorette": {
++      "version": "2.0.16",
++      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
++      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=14"
++      }
++    },
++    "node_modules/cross-spawn": {
++      "version": "7.0.3",
++      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
++      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "path-key": "^3.1.0",
++        "shebang-command": "^2.0.0",
++        "which": "^2.0.1"
++      },
++      "engines": {
++        "node": ">= 8"
++      }
++    },
++    "node_modules/electron-to-chromium": {
++      "version": "1.3.836",
++      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.836.tgz",
++      "integrity": "sha512-Ney3pHOJBWkG/AqYjrW0hr2AUCsao+2uvq9HUlRP8OlpSdk/zOHOUJP7eu0icDvePC9DlgffuelP4TnOJmMRUg==",
++      "dev": true,
++      "license": "ISC"
++    },
++    "node_modules/enhanced-resolve": {
++      "version": "5.10.0",
++      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
++      "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "graceful-fs": "^4.2.4",
++        "tapable": "^2.2.0"
++      },
++      "engines": {
++        "node": ">=10.13.0"
++      }
++    },
++    "node_modules/envinfo": {
++      "version": "7.8.1",
++      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
++      "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
++      "dev": true,
++      "license": "MIT",
++      "bin": {
++        "envinfo": "dist/cli.js"
++      },
++      "engines": {
++        "node": ">=4"
++      }
++    },
++    "node_modules/es-module-lexer": {
++      "version": "1.2.1",
++      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz",
++      "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/escalade": {
++      "version": "3.1.1",
++      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
++      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6"
++      }
++    },
++    "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,
++      "license": "BSD-2-Clause",
++      "dependencies": {
++        "esrecurse": "^4.3.0",
++        "estraverse": "^4.1.1"
++      },
++      "engines": {
++        "node": ">=8.0.0"
++      }
++    },
++    "node_modules/esrecurse": {
++      "version": "4.3.0",
++      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
++      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
++      "dev": true,
++      "license": "BSD-2-Clause",
++      "dependencies": {
++        "estraverse": "^5.2.0"
++      },
++      "engines": {
++        "node": ">=4.0"
++      }
++    },
++    "node_modules/esrecurse/node_modules/estraverse": {
++      "version": "5.2.0",
++      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
++      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
++      "dev": true,
++      "license": "BSD-2-Clause",
++      "engines": {
++        "node": ">=4.0"
++      }
++    },
++    "node_modules/estraverse": {
++      "version": "4.3.0",
++      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
++      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
++      "dev": true,
++      "license": "BSD-2-Clause",
++      "engines": {
++        "node": ">=4.0"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=0.8.x"
++      }
++    },
++    "node_modules/fast-deep-equal": {
++      "version": "3.1.3",
++      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
++      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/fast-json-stable-stringify": {
++      "version": "2.1.0",
++      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
++      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/fastest-levenshtein": {
++      "version": "1.0.12",
++      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
++      "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/fill-range": {
++      "version": "7.0.1",
++      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
++      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "to-regex-range": "^5.0.1"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "locate-path": "^5.0.0",
++        "path-exists": "^4.0.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/function-bind": {
++      "version": "1.1.1",
++      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
++      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "BSD-2-Clause"
++    },
++    "node_modules/graceful-fs": {
++      "version": "4.2.9",
++      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
++      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
++      "dev": true,
++      "license": "ISC"
++    },
++    "node_modules/has": {
++      "version": "1.0.3",
++      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
++      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "function-bind": "^1.1.1"
++      },
++      "engines": {
++        "node": ">= 0.4.0"
++      }
++    },
++    "node_modules/has-flag": {
++      "version": "4.0.0",
++      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
++      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/import-local": {
++      "version": "3.0.2",
++      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
++      "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
++      "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"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=10.13.0"
++      }
++    },
++    "node_modules/is-core-module": {
++      "version": "2.11.0",
++      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
++      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "has": "^1.0.3"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/ljharb"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=0.12.0"
++      }
++    },
++    "node_modules/is-plain-object": {
++      "version": "2.0.4",
++      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
++      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "isobject": "^3.0.1"
++      },
++      "engines": {
++        "node": ">=0.10.0"
++      }
++    },
++    "node_modules/isexe": {
++      "version": "2.0.0",
++      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
++      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
++      "dev": true,
++      "license": "ISC"
++    },
++    "node_modules/isobject": {
++      "version": "3.0.1",
++      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
++      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=0.10.0"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "@types/node": "*",
++        "merge-stream": "^2.0.0",
++        "supports-color": "^8.0.0"
++      },
++      "engines": {
++        "node": ">= 10.13.0"
++      }
++    },
++    "node_modules/jest-worker/node_modules/supports-color": {
++      "version": "8.1.1",
++      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
++      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
++      "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/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,
++      "license": "MIT"
++    },
++    "node_modules/json-schema-traverse": {
++      "version": "0.4.1",
++      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
++      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=0.10.0"
++      }
++    },
++    "node_modules/loader-runner": {
++      "version": "4.2.0",
++      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
++      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6.11.5"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "p-locate": "^4.1.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/lru-cache": {
++      "version": "6.0.0",
++      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
++      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
++      "dev": true,
++      "license": "ISC",
++      "dependencies": {
++        "yallist": "^4.0.0"
++      },
++      "engines": {
++        "node": ">=10"
++      }
++    },
++    "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,
++      "license": "MIT"
++    },
++    "node_modules/micromatch": {
++      "version": "4.0.4",
++      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
++      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "braces": "^3.0.1",
++        "picomatch": "^2.2.3"
++      },
++      "engines": {
++        "node": ">=8.6"
++      }
++    },
++    "node_modules/mime-db": {
++      "version": "1.49.0",
++      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz",
++      "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">= 0.6"
++      }
++    },
++    "node_modules/mime-types": {
++      "version": "2.1.32",
++      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz",
++      "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "mime-db": "1.49.0"
++      },
++      "engines": {
++        "node": ">= 0.6"
++      }
++    },
++    "node_modules/minimatch": {
++      "version": "9.0.3",
++      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
++      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
++      "dependencies": {
++        "brace-expansion": "^2.0.1"
++      },
++      "engines": {
++        "node": ">=16 || 14 >=14.17"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/isaacs"
++      }
++    },
++    "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,
++      "license": "MIT"
++    },
++    "node_modules/node-releases": {
++      "version": "1.1.75",
++      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
++      "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "p-try": "^2.0.0"
++      },
++      "engines": {
++        "node": ">=6"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/sindresorhus"
++      }
++    },
++    "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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "p-limit": "^2.2.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "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==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6"
++      }
++    },
++    "node_modules/path-browserify": {
++      "version": "1.0.1",
++      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
++      "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT",
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/path-key": {
++      "version": "3.1.1",
++      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
++      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
++      "dev": true,
++      "license": "MIT",
++      "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,
++      "license": "MIT"
++    },
++    "node_modules/picomatch": {
++      "version": "2.3.0",
++      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
++      "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=8.6"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/jonschlinkert"
++      }
++    },
++    "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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "find-up": "^4.0.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/process": {
++      "version": "0.11.10",
++      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
++      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">= 0.6.0"
++      }
++    },
++    "node_modules/punycode": {
++      "version": "2.1.1",
++      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
++      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6"
++      }
++    },
++    "node_modules/randombytes": {
++      "version": "2.1.0",
++      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
++      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "safe-buffer": "^5.1.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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "resolve": "^1.20.0"
++      },
++      "engines": {
++        "node": ">= 10.13.0"
++      }
++    },
++    "node_modules/request-light": {
++      "version": "0.7.0",
++      "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz",
++      "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/resolve": {
++      "version": "1.22.1",
++      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
++      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "is-core-module": "^2.9.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-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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "resolve-from": "^5.0.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "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==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "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==",
++      "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/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,
++      "license": "MIT",
++      "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",
++      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
++      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
++      "dev": true,
++      "license": "ISC",
++      "dependencies": {
++        "lru-cache": "^6.0.0"
++      },
++      "bin": {
++        "semver": "bin/semver.js"
++      },
++      "engines": {
++        "node": ">=10"
++      }
++    },
++    "node_modules/serialize-javascript": {
++      "version": "6.0.1",
++      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
++      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
++      "dev": true,
++      "license": "BSD-3-Clause",
++      "dependencies": {
++        "randombytes": "^2.1.0"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "kind-of": "^6.0.2"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/shebang-command": {
++      "version": "2.0.0",
++      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
++      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "shebang-regex": "^3.0.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/shebang-regex": {
++      "version": "3.0.0",
++      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
++      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "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==",
++      "dev": true,
++      "license": "BSD-3-Clause",
++      "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==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "buffer-from": "^1.0.0",
++        "source-map": "^0.6.0"
++      }
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "has-flag": "^4.0.0"
++      },
++      "engines": {
++        "node": ">=8"
++      }
++    },
++    "node_modules/supports-preserve-symlinks-flag": {
++      "version": "1.0.0",
++      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
++      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">= 0.4"
++      },
++      "funding": {
++        "url": "https://github.com/sponsors/ljharb"
++      }
++    },
++    "node_modules/tapable": {
++      "version": "2.2.1",
++      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
++      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=6"
++      }
++    },
++    "node_modules/terser": {
++      "version": "5.17.7",
++      "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz",
++      "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==",
++      "dev": true,
++      "license": "BSD-2-Clause",
++      "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.9",
++      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
++      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@jridgewell/trace-mapping": "^0.3.17",
++        "jest-worker": "^27.4.5",
++        "schema-utils": "^3.1.1",
++        "serialize-javascript": "^6.0.1",
++        "terser": "^5.16.8"
++      },
++      "engines": {
++        "node": ">= 10.13.0"
++      },
++      "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-webpack-plugin/node_modules/@jridgewell/trace-mapping": {
++      "version": "0.3.18",
++      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
++      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "@jridgewell/resolve-uri": "3.1.0",
++        "@jridgewell/sourcemap-codec": "1.4.14"
++      }
++    },
++    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
++      "version": "3.1.1",
++      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
++      "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
++      "dev": true,
++      "license": "MIT",
++      "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/terser/node_modules/acorn": {
++      "version": "8.8.2",
++      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
++      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
++      "dev": true,
++      "license": "MIT",
++      "bin": {
++        "acorn": "bin/acorn"
++      },
++      "engines": {
++        "node": ">=0.4.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,
++      "license": "MIT"
++    },
++    "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,
++      "license": "MIT",
++      "dependencies": {
++        "is-number": "^7.0.0"
++      },
++      "engines": {
++        "node": ">=8.0"
++      }
++    },
++    "node_modules/ts-loader": {
++      "version": "9.5.0",
++      "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz",
++      "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==",
++      "dev": true,
++      "dependencies": {
++        "chalk": "^4.1.0",
++        "enhanced-resolve": "^5.0.0",
++        "micromatch": "^4.0.0",
++        "semver": "^7.3.4",
++        "source-map": "^0.7.4"
++      },
++      "engines": {
++        "node": ">=12.0.0"
++      },
++      "peerDependencies": {
++        "typescript": "*",
++        "webpack": "^5.0.0"
++      }
++    },
++    "node_modules/ts-loader/node_modules/source-map": {
++      "version": "0.7.4",
++      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
++      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
++      "dev": true,
++      "engines": {
++        "node": ">= 8"
++      }
++    },
++    "node_modules/typescript": {
++      "version": "5.2.2",
++      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
++      "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
++      "dev": true,
++      "peer": true,
++      "bin": {
++        "tsc": "bin/tsc",
++        "tsserver": "bin/tsserver"
++      },
++      "engines": {
++        "node": ">=14.17"
++      }
++    },
++    "node_modules/uri-js": {
++      "version": "4.4.1",
++      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
++      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
++      "dev": true,
++      "license": "BSD-2-Clause",
++      "dependencies": {
++        "punycode": "^2.1.0"
++      }
++    },
++    "node_modules/vscode-uri": {
++      "version": "3.0.8",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/watchpack": {
++      "version": "2.4.0",
++      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
++      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "glob-to-regexp": "^0.4.1",
++        "graceful-fs": "^4.1.2"
++      },
++      "engines": {
++        "node": ">=10.13.0"
++      }
++    },
++    "node_modules/webpack": {
++      "version": "5.89.0",
++      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
++      "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
++      "dev": true,
++      "dependencies": {
++        "@types/eslint-scope": "^3.7.3",
++        "@types/estree": "^1.0.0",
++        "@webassemblyjs/ast": "^1.11.5",
++        "@webassemblyjs/wasm-edit": "^1.11.5",
++        "@webassemblyjs/wasm-parser": "^1.11.5",
++        "acorn": "^8.7.1",
++        "acorn-import-assertions": "^1.9.0",
++        "browserslist": "^4.14.5",
++        "chrome-trace-event": "^1.0.2",
++        "enhanced-resolve": "^5.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.7",
++        "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-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,
++      "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-merge": {
++      "version": "5.8.0",
++      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
++      "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "clone-deep": "^4.0.1",
++        "wildcard": "^2.0.0"
++      },
++      "engines": {
++        "node": ">=10.0.0"
++      }
++    },
++    "node_modules/webpack-sources": {
++      "version": "3.2.3",
++      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
++      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
++      "dev": true,
++      "license": "MIT",
++      "engines": {
++        "node": ">=10.13.0"
++      }
++    },
++    "node_modules/webpack/node_modules/@types/estree": {
++      "version": "1.0.1",
++      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz",
++      "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/webpack/node_modules/enhanced-resolve": {
++      "version": "5.15.0",
++      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
++      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
++      "dev": true,
++      "license": "MIT",
++      "dependencies": {
++        "graceful-fs": "^4.2.4",
++        "tapable": "^2.2.0"
++      },
++      "engines": {
++        "node": ">=10.13.0"
++      }
++    },
++    "node_modules/which": {
++      "version": "2.0.2",
++      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
++      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
++      "dev": true,
++      "license": "ISC",
++      "dependencies": {
++        "isexe": "^2.0.0"
++      },
++      "bin": {
++        "node-which": "bin/node-which"
++      },
++      "engines": {
++        "node": ">= 8"
++      }
++    },
++    "node_modules/wildcard": {
++      "version": "2.0.0",
++      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
++      "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
++      "dev": true,
++      "license": "MIT"
++    },
++    "node_modules/yallist": {
++      "version": "4.0.0",
++      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
++      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
++      "dev": true,
++      "license": "ISC"
++    }
++  }
+ }
+diff --git a/node_modules/@vscode/test-web/fs-provider/package.json b/node_modules/@vscode/test-web/fs-provider/package.json
+index e0fd862..95a2ec0 100644
+--- a/node_modules/@vscode/test-web/fs-provider/package.json
++++ b/node_modules/@vscode/test-web/fs-provider/package.json
+@@ -1,48 +1,55 @@
+ {
+-	"name": "vscode-test-web-fs",
+-	"private": true,
+-	"displayName": "vscode-test-web file system provider",
+-	"description": "Provides a file provider for web tests to access local files and folders.",
+-	"publisher": "vscode",
+-	"version": "0.0.1",
+-	"license": "MIT",
+-	"engines": {
+-		"vscode": "^1.72.0"
+-	},
+-	"categories": [
+-		"Other"
+-	],
+-	"activationEvents": [
+-		"onFileSystem:vscode-test-web"
+-	],
+-	"contributes": {
+-		"resourceLabelFormatters": [
+-			{
+-				"authority": "mount",
+-				"scheme": "vscode-test-web",
+-				"formatting": {
+-					"workspaceSuffix": "Test Files",
+-					"label": "${path}"
+-				}
+-			}
+-		]
+-	},
+-	"browser": "./dist/fsExtensionMain.js",
+-	"scripts": {
+-		"vscode:prepublish": "npm run package-web",
+-		"compile-web": "webpack",
+-		"watch-web": "webpack --watch",
+-		"package-web": "webpack --mode production --devtool hidden-source-map"
+-	},
+-	"devDependencies": {
+-		"@types/vscode": "^1.81.0",
+-		"@types/webpack-env": "^1.18.3",
+-		"ts-loader": "^9.5.0",
+-		"webpack": "^5.89.0",
+-		"webpack-cli": "^5.1.4",
+-		"process": "^0.11.10",
+-		"path-browserify": "^1.0.1",
+-		"request-light": "^0.7.0",
+-		"vscode-uri": "^3.0.8"
+-	}
++  "name": "vscode-test-web-fs",
++  "private": true,
++  "displayName": "vscode-test-web file system provider",
++  "description": "Provides a file provider for web tests to access local files and folders.",
++  "publisher": "vscode",
++  "version": "0.0.1",
++  "license": "MIT",
++  "engines": {
++    "vscode": "^1.72.0"
++  },
++  "categories": [
++    "Other"
++  ],
++  "activationEvents": [
++    "onFileSystem:vscode-test-web",
++    "onSearch:vscode-test-web"
++  ],
++  "enabledApiProposals": [
++    "fileSearchProvider"
++  ],
++  "contributes": {
++    "resourceLabelFormatters": [
++      {
++        "authority": "mount",
++        "scheme": "vscode-test-web",
++        "formatting": {
++          "workspaceSuffix": "Test Files",
++          "label": "${path}"
++        }
++      }
++    ]
++  },
++  "browser": "./dist/fsExtensionMain.js",
++  "scripts": {
++    "vscode:prepublish": "npm run package-web",
++    "compile-web": "webpack",
++    "watch-web": "webpack --watch",
++    "package-web": "webpack --mode production --devtool hidden-source-map"
++  },
++  "devDependencies": {
++    "@types/vscode": "^1.81.0",
++    "@types/webpack-env": "^1.18.3",
++    "path-browserify": "^1.0.1",
++    "process": "^0.11.10",
++    "request-light": "^0.7.0",
++    "ts-loader": "^9.5.0",
++    "vscode-uri": "^3.0.8",
++    "webpack": "^5.89.0",
++    "webpack-cli": "^5.1.4"
++  },
++  "dependencies": {
++    "minimatch": "^9.0.3"
++  }
+ }
diff --git a/web/src/runTest.ts b/web/src/runTest.ts
new file mode 100644
index 00000000..4c607563
--- /dev/null
+++ b/web/src/runTest.ts
@@ -0,0 +1,42 @@
+import * as path from "path";
+import { runTests } from "@vscode/test-web";
+
+async function main() {
+	try {
+		// The folder containing the Extension Manifest package.json
+		const extensionDevelopmentPath = path.resolve(__dirname, "../../");
+
+		// The path to module with the test runner and tests
+		const extensionTestsPath = path.resolve(__dirname, "suite/index");
+
+		const folderPath = path.resolve(__dirname, "../../fixtures/e2e");
+
+		const attachArgName = "--waitForDebugger=";
+		const waitForDebugger = process.argv.find((arg) =>
+			arg.startsWith(attachArgName),
+		);
+
+		// Start a web server that serves VSCode in a browser, run the tests
+		await runTests({
+			headless: true,
+			browserType: "chromium",
+			extensionDevelopmentPath,
+			extensionTestsPath,
+			extensionIds: [
+				// At time of writing, these don't work in the browser
+				// { id: "octref.vetur" },
+				// { id: "svelte.svelte-vscode" },
+				// { id: "astro-build.astro-vscode" },
+			],
+			folderPath,
+			waitForDebugger: waitForDebugger
+				? Number(waitForDebugger.slice(attachArgName.length))
+				: undefined,
+		});
+	} catch (err) {
+		console.error("Failed to run tests");
+		process.exit(1);
+	}
+}
+
+main();
diff --git a/web/src/suite/completion.test.ts b/web/src/suite/completion.test.ts
new file mode 100644
index 00000000..39a7fedc
--- /dev/null
+++ b/web/src/suite/completion.test.ts
@@ -0,0 +1,337 @@
+import * as assert from "assert";
+import * as vscode from "vscode";
+import { getDocUri, position, showFile, sleep } from "./util";
+
+type CompletionTestOptions = {
+	/**
+	 * @default false
+	 */
+	expectNoMatch: boolean;
+};
+
+async function testCompletion(
+	docUri: vscode.Uri,
+	position: vscode.Position,
+	expectedItems: (string | vscode.CompletionItem)[],
+	options: CompletionTestOptions = { expectNoMatch: false },
+) {
+	await showFile(docUri);
+
+	const result = (await vscode.commands.executeCommand(
+		"vscode.executeCompletionItemProvider",
+		docUri,
+		position,
+	)) as vscode.CompletionList;
+
+	expectedItems.forEach((ei) => {
+		if (typeof ei === "string") {
+			if (options.expectNoMatch) {
+				const match = result.items.find((i) => i.label === ei);
+				if (!match) {
+					assert.ok(`Found no match for ${ei}`);
+				} else {
+					assert.fail(
+						`Expected NOT to find ${ei} among results, but it's there: ${result.items.map(
+							(i) => i.label,
+						)}`,
+					);
+				}
+				return;
+			} else {
+				assert.ok(
+					result.items.some((i) => {
+						return i.label === ei;
+					}),
+					`Expected to find ${ei} among results`,
+				);
+			}
+		} else {
+			const match = result.items.find((i) => {
+				if (typeof i.label === "string") {
+					return i.label === ei.label;
+				}
+				return i.label.label === ei.label;
+			});
+			if (!match) {
+				if (options.expectNoMatch) {
+					assert.ok(`Found no match for ${ei.label}`);
+				} else {
+					assert.fail(
+						`Can't find matching item for ${JSON.stringify(ei, null, 2)}`,
+					);
+				}
+				return;
+			}
+
+			if (typeof match.label === "string") {
+				assert.strictEqual(match.label, ei.label);
+			} else {
+				assert.strictEqual(match.label.label, ei.label);
+			}
+
+			if (ei.kind) {
+				assert.strictEqual(match.kind, ei.kind);
+			}
+			if (ei.detail) {
+				assert.strictEqual(match.detail, ei.detail);
+			}
+			if (ei.insertText) {
+				const value =
+					typeof ei.insertText === "string"
+						? ei.insertText
+						: ei.insertText.value;
+				assert.ok(
+					JSON.stringify(match.insertText).includes(value),
+					`Expected insertText to include ${value}. Actual: ${JSON.stringify(
+						match.insertText,
+					)}`,
+				);
+			}
+
+			// This may deliberatly be undefined, in which case the filter matches the label
+			if (Object.prototype.hasOwnProperty.call(ei, "filterText")) {
+				assert.strictEqual(
+					JSON.stringify(match.filterText),
+					ei.filterText,
+					`Expected filterText to match ${
+						ei.filterText
+					}. Actual: ${JSON.stringify(match.filterText)}`,
+				);
+			}
+
+			if (ei.documentation) {
+				if (typeof match.documentation === "string") {
+					assert.strictEqual(match.documentation, ei.documentation);
+				} else {
+					const value = ei.documentation
+						? typeof ei.documentation === "string"
+							? ei.documentation
+							: ei.documentation.value
+						: "";
+					if (value && match.documentation) {
+						assert.strictEqual(
+							(match.documentation as vscode.MarkdownString).value,
+							value,
+						);
+					}
+				}
+			}
+		}
+	});
+}
+
+describe("Completions", () => {
+	const docUri = getDocUri("completion/main.scss");
+
+	before(async () => {
+		await showFile(docUri);
+		await sleep();
+	});
+
+	it("from partial file", async () => {
+		const expectedCompletions = [{ label: "$partial" }];
+
+		await testCompletion(docUri, position(17, 11), expectedCompletions);
+	});
+
+	it("for namespaces including prefixes", async () => {
+		let expectedCompletions = [
+			{
+				label: "$var-var-variable",
+				insertText: '".$var-var-variable"',
+				filterText: '"ns.$var-var-variable"',
+			},
+			{
+				label: "fun-fun-function",
+				insertText: '".fun-fun-function()"',
+			},
+		];
+
+		await testCompletion(docUri, position(23, 13), expectedCompletions);
+
+		expectedCompletions = [
+			{
+				label: "mix-mix-mixin",
+				insertText: '".mix-mix-mixin"',
+			},
+		];
+
+		await testCompletion(docUri, position(24, 15), expectedCompletions);
+	});
+
+	it("inside string interpolation", async () => {
+		const expectedCompletions = [
+			{
+				label: "$var-var-variable",
+				insertText: '".$var-var-variable"',
+				filterText: '"ns.$var-var-variable"',
+			},
+			{
+				label: "fun-fun-function",
+				insertText: '".fun-fun-function()"',
+			},
+		];
+
+		await testCompletion(docUri, position(25, 40), expectedCompletions);
+	});
+
+	it("inside string interpolation with preceeding non-space character", async () => {
+		const expectedCompletions = [
+			{
+				label: "$var-var-variable",
+				insertText: '".$var-var-variable"',
+				filterText: '"ns.$var-var-variable"',
+			},
+			{
+				label: "fun-fun-function",
+				insertText: '".fun-fun-function()"',
+			},
+		];
+
+		await testCompletion(docUri, position(26, 20), expectedCompletions);
+	});
+
+	it("as part of return statement", async () => {
+		const expectedCompletions = [
+			{
+				label: "$var-var-variable",
+				insertText: '".$var-var-variable"',
+				filterText: '"ns.$var-var-variable"',
+			},
+			{
+				label: "fun-fun-function",
+				insertText: '".fun-fun-function()"',
+			},
+		];
+
+		await testCompletion(docUri, position(30, 23), expectedCompletions);
+	});
+
+	describe("SassDoc", () => {
+		const docUri = getDocUri("completion/sassdoc.scss");
+
+		before(async () => {
+			await showFile(docUri);
+		});
+
+		it("completions for SassDoc block on mixin without parameters or @content", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText: '" ${0}\\n/// @output ${2}"',
+				},
+			];
+
+			await testCompletion(docUri, position(3, 4), expectedCompletions);
+		});
+
+		it("completions for SassDoc block on mixin with @content", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText: '" ${0}\\n/// @content ${1}\\n/// @output ${2}"',
+				},
+			];
+
+			await testCompletion(docUri, position(8, 4), expectedCompletions);
+		});
+
+		it("completions for SassDoc block on mixin with parameters", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText:
+						'" ${0}\\n/// @param {${1:Number}} \\\\$a [1px] ${2:-}\\n/// @param {${3:Number}} \\\\$b [2px] ${4:-}\\n/// @output ${6:-}"',
+				},
+			];
+
+			await testCompletion(docUri, position(13, 4), expectedCompletions);
+		});
+
+		it("completions for SassDoc block on mixin with parameters and @content", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText:
+						'" ${0}\\n/// @param {${1:type}} \\\\$a ${2:-}\\n/// @param {${3:type}} \\\\$b ${4:-}\\n/// @output ${6:-}"',
+				},
+			];
+
+			await testCompletion(docUri, position(18, 4), expectedCompletions);
+		});
+
+		it("completions for SassDoc block on parameterless function", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText:
+						'" ${0}\\n/// @param {${1:type}} \\\\ ${2:-}\\n/// @return {${3:type}} ${4:-}"',
+				},
+			];
+
+			await testCompletion(docUri, position(25, 4), expectedCompletions);
+		});
+
+		it("completions for SassDoc block on parameterfull function", async () => {
+			const expectedCompletions = [
+				{
+					label: "SassDoc block",
+					insertText:
+						'" ${0}\\n/// @param {${1:Number}} \\\\$a [1px] ${2:-}\\n/// @param {${3:Number}} \\\\$b [2px] ${4:-}\\n/// @return {${5:type}} ${6:-}"',
+				},
+			];
+
+			await testCompletion(docUri, position(30, 4), expectedCompletions);
+		});
+	});
+
+	describe("Placeholders", () => {
+		const docUri = getDocUri("completion/placeholders.scss");
+
+		before(async () => {
+			await showFile(docUri);
+		});
+
+		it("get completions", async () => {
+			const expectedCompletions = [
+				{
+					label: "%mediumAlert",
+					insertText: "mediumAlert",
+				},
+			];
+
+			await testCompletion(docUri, position(9, 14), expectedCompletions);
+		});
+	});
+
+	describe("Reverse placeholders", () => {
+		const docUri = getDocUri("completion/reverse-placeholders/_theme.scss");
+
+		before(async () => {
+			await showFile(docUri);
+			// TODO: figure out why we need to open main.scss and sleep here in the test. It works as expected in the browser.
+			await showFile(getDocUri("completion/reverse-placeholders/main.scss"));
+			await sleep();
+		});
+
+		it("when implementing a placeholder selector", async () => {
+			await testCompletion(docUri, position(1, 2), [
+				{
+					label: "%app",
+					insertText: "app",
+				},
+				{
+					label: "%chat",
+					insertText: "chat",
+				},
+			]);
+
+			await testCompletion(docUri, position(3, 4), [
+				{
+					label: "%chat",
+					insertText: "chat",
+				},
+			]);
+		});
+	});
+});
diff --git a/web/src/suite/definitions.test.ts b/web/src/suite/definitions.test.ts
new file mode 100644
index 00000000..2bd67d2f
--- /dev/null
+++ b/web/src/suite/definitions.test.ts
@@ -0,0 +1,79 @@
+import * as assert from "assert";
+import * as vscode from "vscode";
+import { getDocUri, showFile, position, sameLineLocation, sleep } from "./util";
+
+async function testDefinition(
+	docUri: vscode.Uri,
+	position: vscode.Position,
+	expectedLocation: vscode.Location,
+) {
+	await showFile(docUri);
+
+	const result: any = await vscode.commands.executeCommand(
+		"vscode.executeDefinitionProvider",
+		docUri,
+		position,
+	);
+
+	if (result[0] === undefined) {
+		assert.fail("The 'result[0]' is undefined.");
+	}
+
+	assert.ok(
+		result[0].range.isEqual(expectedLocation.range),
+		`Expected ${JSON.stringify(result[0].range)} to equal ${JSON.stringify(
+			expectedLocation.range,
+		)} in ${docUri.fsPath}`,
+	);
+	assert.strictEqual(result[0].uri.fsPath, expectedLocation.uri.fsPath);
+}
+
+describe("Definitions", function () {
+	const docUri = getDocUri("definition/main.scss");
+
+	before(async () => {
+		await showFile(docUri);
+		await sleep(1000);
+	});
+
+	it("should find definition for variables", async () => {
+		const expectedDocumentUri = getDocUri("_variables.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 10);
+		await testDefinition(docUri, position(7, 15), expectedLocation);
+	});
+
+	it("should find definition for functions", async () => {
+		const expectedDocumentUri = getDocUri("_functions.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 9);
+
+		await testDefinition(docUri, position(7, 25), expectedLocation);
+	});
+
+	it("should find definition for mixins", async () => {
+		const expectedDocumentUri = getDocUri("_mixins.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 6);
+
+		await testDefinition(docUri, position(9, 13), expectedLocation);
+	});
+
+	it("should find definition for placeholder", async () => {
+		const expectedDocumentUri = getDocUri("_placeholders.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 7);
+
+		await testDefinition(docUri, position(20, 14), expectedLocation);
+	});
+
+	it("should find symbol definition behind namespace", async () => {
+		const expectedDocumentUri = getDocUri("namespace/_variables.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 18);
+
+		await testDefinition(docUri, position(15, 15), expectedLocation);
+	});
+
+	it("should find symbol definition behind namespace and prefix", async () => {
+		const expectedDocumentUri = getDocUri("namespace/_mixins.scss");
+		const expectedLocation = sameLineLocation(expectedDocumentUri, 1, 1, 10);
+
+		await testDefinition(docUri, position(16, 18), expectedLocation);
+	});
+});
diff --git a/web/src/suite/example.test.ts b/web/src/suite/example.test.ts
new file mode 100644
index 00000000..9448f036
--- /dev/null
+++ b/web/src/suite/example.test.ts
@@ -0,0 +1,11 @@
+import * as assert from "assert";
+import * as vscode from "vscode";
+
+describe("Web Extension Test Suite", () => {
+	vscode.window.showInformationMessage("Start all tests.");
+
+	it("Sample test", () => {
+		assert.strictEqual(-1, [1, 2, 3].indexOf(5));
+		assert.strictEqual(-1, [1, 2, 3].indexOf(0));
+	});
+});
diff --git a/web/src/suite/hover.test.ts b/web/src/suite/hover.test.ts
new file mode 100644
index 00000000..bec11748
--- /dev/null
+++ b/web/src/suite/hover.test.ts
@@ -0,0 +1,149 @@
+import * as assert from "assert";
+import * as vscode from "vscode";
+import { getDocUri, showFile, position, sleep } from "./util";
+
+async function testHover(
+	docUri: vscode.Uri,
+	position: vscode.Position,
+	expectedHover: vscode.Hover,
+) {
+	await showFile(docUri);
+
+	const result: any[] = await vscode.commands.executeCommand(
+		"vscode.executeHoverProvider",
+		docUri,
+		position,
+	);
+
+	if (!result[0]) {
+		throw new Error(`Hover failed at position ${JSON.stringify(position)}`);
+	}
+
+	const contents = result
+		.map((item) => {
+			return item.contents.map((content: any) => content.value);
+		})
+		.join("\n");
+
+	// We use `.includes` here because the hover can contain content from other plugins.
+	assert.ok(
+		contents.includes(expectedHover.contents.join("")),
+		`Hover does not include expected output. Actual: '${contents}'.`,
+	);
+
+	if (expectedHover.range && result[0] && result[0].range) {
+		assert.ok(
+			result[0].range.isEqual(expectedHover.range),
+			`Expected output does not match expected range. Actual: '${result[0].range?.toString()}'.`,
+		);
+	}
+}
+
+describe("Hover", () => {
+	const docUri = getDocUri("hover/main.scss");
+	const collisionUri = getDocUri("hover/collision.scss");
+
+	before(async () => {
+		await showFile(docUri);
+		await showFile(collisionUri);
+		await sleep();
+	});
+
+	it("for variables", async () => {
+		const expectedContents = {
+			contents: [
+				"```scss\n$variable: 'value';\n```\n____\nVariable declared in _variables.scss",
+			],
+		};
+
+		await testHover(docUri, position(7, 13), expectedContents);
+	});
+
+	it("for functions", async () => {
+		const expectedContents = {
+			contents: [
+				"```scss\n@function function()\n```\n____\nFunction declared in _functions.scss",
+			],
+		};
+
+		await testHover(docUri, position(7, 24), expectedContents);
+	});
+
+	it("for mixins", async () => {
+		const expectedContents = {
+			contents: [
+				"```scss\n@mixin mixin()\n```\n____\nMixin declared in _mixins.scss",
+			],
+		};
+
+		await testHover(docUri, position(9, 12), expectedContents);
+	});
+
+	it("for placeholders", async () => {
+		const expectedContents = {
+			contents: [
+				"```scss\n%alert\n```\n____\nPlaceholder declared in _placeholders.scss",
+			],
+		};
+
+		await testHover(docUri, position(30, 14), expectedContents);
+	});
+
+	it("for symbol behind namespace", async () => {
+		const expectedContents = {
+			contents: [
+				"```scss\n$var-var-variable: 'value';\n```\n____\nVariable declared in _variables.scss",
+			],
+		};
+
+		await testHover(docUri, position(15, 14), expectedContents);
+	});
+
+	it("for symbol behind namespace and prefix", async () => {
+		// Prefixed symbols are shown with their original names
+		const expectedContents = {
+			contents: [
+				"```scss\n@mixin mix-mixin()\n```\n____\nMixin declared in _mixins.scss",
+			],
+		};
+
+		await testHover(docUri, position(16, 17), expectedContents);
+	});
+
+	it("for SassDoc annotations", async () => {
+		// Prefixed symbols are shown with their original names
+		const expectedContents = {
+			contents: [
+				"@type\n____\n[SassDoc reference](http://sassdoc.com/annotations/#type)",
+			],
+		};
+
+		await testHover(docUri, position(20, 6), expectedContents);
+
+		const expectedEmpty = {
+			contents: [""],
+		};
+
+		await testHover(docUri, position(20, 5), expectedEmpty);
+	});
+
+	it("for Sass built-in", async () => {
+		// Prefixed symbols are shown with their original names
+		const expectedContents = {
+			contents: [
+				"Rounds down to the nearest whole number.\n\n[Sass reference](https://sass-lang.com/documentation/modules/math#floor)",
+			],
+		};
+
+		await testHover(docUri, position(26, 22), expectedContents);
+	});
+
+	it("shows hover for user-defined symbol in case of naming collision with built-in", async () => {
+		// Prefixed symbols are shown with their original names
+		const expectedContents = {
+			contents: ["Deliberate name collision with sass:map"],
+		};
+
+		await testHover(collisionUri, position(5, 20), expectedContents);
+	});
+});
diff --git a/web/src/suite/index.ts b/web/src/suite/index.ts
new file mode 100644
index 00000000..0c3e9d9d
--- /dev/null
+++ b/web/src/suite/index.ts
@@ -0,0 +1,31 @@
+// imports mocha for the browser, defining the `mocha` global.
+require("mocha/mocha");
+
+export function run(): Promise {
+	return new Promise((c, e) => {
+		mocha.setup({
+			ui: "bdd",
+			reporter: undefined,
+			timeout: 20000,
+		});
+
+		// bundles all files in the current directory matching `*.test`
+		const importAll = (r: __WebpackModuleApi.RequireContext) =>
+			r.keys().forEach(r);
+		importAll(require.context(".", true, /\.test$/));
+
+		try {
+			// Run the mocha test
+			mocha.run((failures) => {
+				if (failures > 0) {
+					e(new Error(`${failures} tests failed.`));
+				} else {
+					c();
+				}
+			});
+		} catch (err) {
+			console.error(err);
+			e(err);
+		}
+	});
+}
diff --git a/web/src/suite/signature.test.ts b/web/src/suite/signature.test.ts
new file mode 100644
index 00000000..932d03c0
--- /dev/null
+++ b/web/src/suite/signature.test.ts
@@ -0,0 +1,244 @@
+import * as assert from "assert";
+import * as vscode from "vscode";
+import { getDocUri, showFile, position, sleep } from "./util";
+
+async function testSignature(
+	docUri: vscode.Uri,
+	position: vscode.Position,
+	signature: vscode.SignatureHelp,
+) {
+	await showFile(docUri);
+
+	const result = await vscode.commands.executeCommand(
+		"vscode.executeSignatureHelpProvider",
+		docUri,
+		position,
+	);
+
+	if (result === undefined) {
+		assert.fail("The 'result' is undefined.");
+	}
+
+	assert.strictEqual(
+		result.activeParameter,
+		signature.activeParameter,
+		`activeParameter in ${docUri.fsPath}`,
+	);
+	assert.strictEqual(
+		result.activeSignature,
+		signature.activeSignature,
+		"activeSignature",
+	);
+
+	assert.strictEqual(
+		result.signatures.length,
+		signature.signatures.length,
+		`Count of signatures: ${signature.signatures.length} expected; ${result.signatures.length} actual`,
+	);
+
+	signature.signatures.forEach((expectedSignature, i) => {
+		const actualSignature = result.signatures[i];
+
+		if (actualSignature === undefined) {
+			assert.fail("The 'actualSignature' is undefined.");
+		}
+
+		assert.strictEqual(actualSignature.label, expectedSignature.label);
+
+		assert.strictEqual(
+			actualSignature.parameters.length,
+			expectedSignature.parameters.length,
+			`Count of parameters for {expectedSignature.label}: ${expectedSignature.parameters.length} expected; ${actualSignature.parameters.length} actual`,
+		);
+	});
+}
+
+describe("Signature", () => {
+	const docUri = getDocUri("signature/main.scss");
+
+	before(async () => {
+		await showFile(docUri);
+		await sleep();
+	});
+
+	describe("mixin", () => {
+		it("should suggest all parameters of mixin", async () => {
+			const expected = {
+				activeParameter: 0,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "square ($size: null, $radius: 0)",
+						parameters: [{ label: "$size" }, { label: "$radius" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(5, 19), expected);
+		});
+
+		it("should suggest all parameters of mixin behind namespace and prefix", async () => {
+			const expected = {
+				activeParameter: 0,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "mix-square ($size: null, $radius: 0)",
+						parameters: [{ label: "$size" }, { label: "$radius" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(14, 30), expected);
+		});
+
+		it("should suggest the second parameter of mixin", async () => {
+			const expected = {
+				activeParameter: 1,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "square ($size: null, $radius: 0)",
+						parameters: [{ label: "$size" }, { label: "$radius" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(6, 21), expected);
+		});
+
+		it("should suggest the second parameter of mixin behind namespace and prefix", async () => {
+			const expected = {
+				activeParameter: 1,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "mix-square ($size: null, $radius: 0)",
+						parameters: [{ label: "$size" }, { label: "$radius" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(15, 32), expected);
+		});
+	});
+
+	describe("function", () => {
+		it("should suggest all parameters of function", async () => {
+			const expected = {
+				activeParameter: 0,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "pow ($base: null, $exponent: null)",
+						parameters: [{ label: "$base" }, { label: "$exponent" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(8, 16), expected);
+		});
+
+		it("should suggest all parameters of function behind namespace and prefix", async () => {
+			const expected = {
+				activeParameter: 0,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "fun-pow ($base: null, $exponent: null)",
+						parameters: [{ label: "$base" }, { label: "$exponent" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(17, 27), expected);
+		});
+
+		it("should suggest the second parameter of function", async () => {
+			const expected = {
+				activeParameter: 1,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "pow ($base: null, $exponent: null)",
+						parameters: [{ label: "$base" }, { label: "$exponent" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(8, 26), expected);
+		});
+
+		it("should suggest the second parameter of function behind namespace and prefix", async () => {
+			const expected = {
+				activeParameter: 1,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "fun-pow ($base: null, $exponent: null)",
+						parameters: [{ label: "$base" }, { label: "$exponent" }],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(17, 48), expected);
+		});
+
+		it("should suggest all parameters of function from Sass built-in", async () => {
+			const expected = {
+				activeParameter: 0,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "clamp ($min, $number, $max)",
+						parameters: [
+							{ label: "$min" },
+							{ label: "$number" },
+							{ label: "$max" },
+						],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(23, 26), expected);
+		});
+
+		it("should suggest second and third parameters of function from Sass built-in", async () => {
+			const expected = {
+				activeParameter: 1,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "clamp ($min, $number, $max)",
+						parameters: [
+							{ label: "$min" },
+							{ label: "$number" },
+							{ label: "$max" },
+						],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(24, 28), expected);
+		});
+
+		it("should suggest third parameters of function from Sass built-in", async () => {
+			const expected = {
+				activeParameter: 2,
+				activeSignature: 0,
+				signatures: [
+					{
+						label: "clamp ($min, $number, $max)",
+						parameters: [
+							{ label: "$min" },
+							{ label: "$number" },
+							{ label: "$max" },
+						],
+					},
+				],
+			};
+
+			await testSignature(docUri, position(25, 30), expected);
+		});
+	});
+});
diff --git a/web/src/suite/util.ts b/web/src/suite/util.ts
new file mode 100644
index 00000000..035479b1
--- /dev/null
+++ b/web/src/suite/util.ts
@@ -0,0 +1,42 @@
+import * as vscode from "vscode";
+
+export function sleep(ms = 1000): Promise {
+	return new Promise((resolve) => setTimeout(resolve, ms));
+}
+
+export function getDocUri(path: string): vscode.Uri {
+	return vscode.Uri.from({
+		scheme: "vscode-test-web",
+		authority: "mount",
+		path: `/${path}`,
+	});
+}
+
+export async function showFile(docUri: vscode.Uri) {
+	const doc = await vscode.workspace.openTextDocument(docUri);
+	return vscode.window.showTextDocument(doc);
+}
+
+/**
+ * Line and Char as shown in lowerright of VS Code
+ */
+export function position(line: number, char: number) {
+	return new vscode.Position(line - 1, char - 1);
+}
+
+export function sameLineRange(
+	line: number,
+	startChar: number,
+	endChar: number,
+) {
+	return new vscode.Range(position(line, startChar), position(line, endChar));
+}
+
+export function sameLineLocation(
+	uri: vscode.Uri,
+	line: number,
+	startChar: number,
+	endChar: number,
+) {
+	return new vscode.Location(uri, sameLineRange(line, startChar, endChar));
+}
diff --git a/web/tsconfig.json b/web/tsconfig.json
new file mode 100644
index 00000000..701c9449
--- /dev/null
+++ b/web/tsconfig.json
@@ -0,0 +1,11 @@
+{
+	"compilerOptions": {
+		"module": "commonjs",
+		"target": "ES2019",
+		"outDir": "dist",
+		"lib": ["ES2019"],
+		"rootDir": "src",
+		"sourceMap": false,
+		"strict": true
+	}
+}
diff --git a/web/tsconfig.runtest.json b/web/tsconfig.runtest.json
new file mode 100644
index 00000000..ae9b3303
--- /dev/null
+++ b/web/tsconfig.runtest.json
@@ -0,0 +1,4 @@
+{
+	"extends": "./tsconfig.json",
+	"include": ["./src/runTest.ts"]
+}
diff --git a/webpack.test-web.config.js b/webpack.test-web.config.js
new file mode 100644
index 00000000..4d58debc
--- /dev/null
+++ b/webpack.test-web.config.js
@@ -0,0 +1,67 @@
+// @ts-check
+
+/* eslint-disable @typescript-eslint/no-var-requires */
+/** @typedef {import('webpack').Configuration} WebpackConfig **/
+
+const path = require("path");
+const webpack = require("webpack");
+
+/** @type WebpackConfig */
+const browserTestsConfig = {
+	context: __dirname,
+	mode: "none",
+	target: "webworker", // web extensions run in a webworker context
+	entry: {
+		"suite/index": "./web/src/suite/index.ts",
+	},
+	output: {
+		filename: "[name].js",
+		path: path.join(__dirname, "web/dist"),
+		libraryTarget: "commonjs",
+	},
+	resolve: {
+		mainFields: ["module", "main"],
+		extensions: [".ts", ".js"],
+		alias: {},
+		fallback: {
+			assert: require.resolve("assert"),
+			events: require.resolve("events/"),
+			path: require.resolve("path-browserify"),
+			util: require.resolve("util/"),
+			"fs/promises": false,
+		},
+	},
+	module: {
+		rules: [
+			{
+				test: /\.m?js/,
+				resolve: {
+					fullySpecified: false,
+				},
+			},
+			{
+				test: /\.ts$/,
+				exclude: /node_modules/,
+				use: [
+					{
+						loader: "ts-loader",
+					},
+				],
+			},
+		],
+	},
+	plugins: [
+		new webpack.ProvidePlugin({
+			process: "process/browser",
+		}),
+	],
+	externals: {
+		vscode: "commonjs vscode",
+	},
+	performance: {
+		hints: false,
+	},
+	devtool: "nosources-source-map",
+};
+
+module.exports = browserTestsConfig;