├── .eslintrc.json ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE.txt ├── SECURITY.md ├── ThirdPartyNotices.txt ├── build ├── pre-release.yml └── stable.yml ├── images ├── mock-debug-icon.png └── mock-debug.gif ├── package.json ├── readme.md ├── sampleWorkspace ├── .vscode │ └── launch.json └── readme.md ├── src ├── activateMockDebug.ts ├── debugAdapter.ts ├── extension.ts ├── mockDebug.ts ├── mockRuntime.ts ├── tests │ ├── adapter.test.ts │ └── data │ │ ├── test.md │ │ ├── testLazyBreakpoint.md │ │ └── testWithException.md └── web-extension.ts ├── tsconfig.json └── yarn.lock /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | }, 19 | "ignorePatterns": [ 20 | "**/*.d.ts" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Run Tests 2 | on: [push, pull_request] 3 | jobs: 4 | test: 5 | runs-on: ubuntu-latest 6 | strategy: 7 | fail-fast: false 8 | matrix: 9 | node-version: ['^16'] 10 | steps: 11 | - uses: actions/checkout@v1 12 | - uses: actions/setup-node@v1 13 | with: 14 | node-version: ${{ matrix.node-version }} 15 | - run: yarn install --frozen-lockfile 16 | - run: yarn test 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | dist 3 | node_modules 4 | .vscode-test/ 5 | npm-debug.log 6 | mock-debug.txt 7 | *.vsix 8 | .DS_Store 9 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint", 6 | "connor4312.esbuild-problem-matchers" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Extension", 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "args": [ 9 | "--extensionDevelopmentPath=${workspaceFolder}", 10 | "${workspaceFolder}/sampleWorkspace" 11 | ], 12 | "outFiles": [ 13 | "${workspaceFolder}/dist/**/*.js" 14 | ], 15 | "preLaunchTask": "npm: watch" 16 | }, 17 | { 18 | "name": "Web Extension", 19 | "type": "extensionHost", 20 | "debugWebWorkerHost": true, 21 | "request": "launch", 22 | "args": [ 23 | "--extensionDevelopmentPath=${workspaceFolder}", 24 | "--extensionDevelopmentKind=web", 25 | "${workspaceFolder}/sampleWorkspace" 26 | ], 27 | "outFiles": [ 28 | "${workspaceFolder}/dist/**/*.js" 29 | ], 30 | "preLaunchTask": "npm: watch web" 31 | }, 32 | { 33 | "name": "Server", 34 | "type": "node", 35 | "request": "launch", 36 | "cwd": "${workspaceFolder}", 37 | "program": "${workspaceFolder}/src/debugAdapter.ts", 38 | "args": [ 39 | "--server=4711" 40 | ], 41 | "outFiles": [ 42 | "${workspaceFolder}/out/**/*.js" 43 | ], 44 | "preLaunchTask": "npm: compile" 45 | }, 46 | { 47 | "name": "Tests", 48 | "type": "node", 49 | "request": "launch", 50 | "cwd": "${workspaceFolder}", 51 | "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", 52 | "args": [ 53 | "-u", "tdd", 54 | "--timeout", "999999", 55 | "--colors", 56 | "./out/tests/" 57 | ], 58 | "outFiles": [ 59 | "${workspaceFolder}/out/**/*.js" 60 | ], 61 | "internalConsoleOptions": "openOnSessionStart", 62 | "preLaunchTask": "npm: compile" 63 | } 64 | ], 65 | "compounds": [ 66 | { 67 | "name": "Extension + Server", 68 | "configurations": [ "Extension", "Server" ] 69 | } 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off", 11 | 12 | "git.branchProtection": ["main"], 13 | "git.branchProtectionPrompt": "alwaysCommitToNewBranch" 14 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "npm", 6 | "script": "build", 7 | "isBackground": false, 8 | "group": { 9 | "isDefault": true, 10 | "kind": "build" 11 | }, 12 | "problemMatcher": "$esbuild", 13 | "label": "npm: build" 14 | }, 15 | { 16 | "type": "npm", 17 | "script": "watch", 18 | "group": "build", 19 | "problemMatcher": "$esbuild-watch", 20 | "isBackground": true, 21 | "label": "npm: watch" 22 | }, 23 | { 24 | "type": "npm", 25 | "script": "watch-web", 26 | "group": "build", 27 | "problemMatcher": "$esbuild-watch", 28 | "isBackground": true, 29 | "label": "npm: watch web" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/**/* 2 | .gitignore 3 | .travis.yml 4 | appveyor.yml 5 | src/**/* 6 | out/tests/**/* 7 | **/*.js.map 8 | build 9 | sampleworkspace 10 | node_modules 11 | tsconfig.json 12 | out 13 | sampleWebWorkerWorkspace 14 | sampleWorkspace -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.50.0 2 | * add some details to completion items 3 | * use DAP 1.55.1 4 | 5 | ## 0.49.6 6 | * support all `output` event categories: `prio(xxx)`, `out(xxx)`, or `err(xxx)` (in addition to `log(xxx)`) 7 | * returns the `lazy` property on the `VariablePresentationHint` if a variable name contains the word "lazy"; the value placeholder for lazy variables is `lazy var`. 8 | 9 | ## 0.48.1 10 | * publish new release under Microsoft publisher 11 | * improved read/write memory behavior, invaldiate memory and variables on change 12 | 13 | ## 0.47.2 14 | * another "pre-release" version of Mock Debug (for testing the pre-release feature) 15 | 16 | ## 0.47.1 17 | * first "pre-release" version of Mock Debug: pre-release versions use odd minor version numbers 18 | * use a pre-release version of the DAP modules 19 | 20 | ## 0.46.11 21 | * preparing to publish "pre-release" version of Mock Debug 22 | 23 | ## 0.46.10 24 | * enable NamedPipe support; fixes #47 25 | * sort Run before Debug command; fixes #58 26 | * improve comments; fixes #60 27 | 28 | ## 0.46.9 29 | * switch from webpack 5 to esbuild 30 | 31 | ## 0.46.9 32 | * upgrade from webpack 4 to webpack 5 33 | 34 | ## 0.46.8 35 | * update dependencies 36 | 37 | ## 0.46.7 38 | * Add line and source information to disassemble instructions. 39 | 40 | ## 0.46.6 41 | * Simplify "no-debug" mode (in order to profit from https://github.com/microsoft/vscode/issues/129255) 42 | 43 | ## 0.46.4 44 | * Generate errors for illegal arguments to `setExpression` request. 45 | * Specify 'compileError' in launch config to simulate a compile/build error in the "launch" request. 46 | 47 | ## 0.46.2 48 | * Implement `setExpression` request. This enables a "Set Value" context menu action on watches. 49 | 50 | ## 0.46.1 51 | * Improved overall stepping behavior: mock debug now behaves like a real debugger: it breaks on a line before executing the line. Previously it was breaking while executing the line. 52 | 53 | ## 0.46.0 54 | * Rewrite Variables; see Readme.md in sampleWorkspace 55 | * Add support for Disassembly View, Instruction Stepping, and Instruction Breakpoints. Instruction breakpoints can be set in the Disassembly view. 56 | 57 | ## 0.45.8 58 | * Register Mock Debug as default debugger for markdown files 59 | 60 | ## 0.45.7 61 | * Add support for data breakpoint access types (a big _Thank You_ to @yannickowow for the PR) 62 | 63 | ## 0.45.6 64 | * Add support for a custom inline value provider that matches variables in a case-insensitive way. 65 | * Group "run" and "debug" editor commands in the new "run" submenu 66 | 67 | ## 0.45.5 68 | * Provide help texts for exception filters via DAP's new `description` and `conditionDescription`properties. 69 | 70 | ## 0.45.4 71 | * Add support for the `exceptionInfo` request. 72 | 73 | ## 0.45.3 74 | * Add support for exception filters (and conditions). "Named Exception" will break on the `exception(xxx)` pattern if the exception condition is set to `xxx`. "Other Exceptions" will break on the word `exception` and the `exception(...)` patterns not matched by "Named Exception". 75 | 76 | ## 0.44.0 77 | * Emit "Invalidated" event if client supports it. 78 | * Changed context menu action "Show as Hex" to "Toggle between decimal and heximal formatting" 79 | 80 | ## 0.43.0 81 | * Add context menu action "Show as Hex" to integer variables in Variables view 82 | * Add new run option "namedPipeServer" for debug adapter in extension.ts 83 | * Use new extension API for passing the "noDebug" option to "vscode.debug.startDebugging" 84 | * Support to run Mock Debug in the browser/web worker 85 | 86 | ## 0.42.2 87 | * Project hygiene: get rid of all warnings 88 | * use eslint instead of tslint 89 | * align with latest yeoman generator for VS Code 90 | 91 | ## 0.42.1 92 | * Add "run" and "debug" actions to editor title 93 | * Implement "Run without debugging" 94 | 95 | ## 0.41.0 96 | * Add support for StepIn and StepOut: StepIn moves execution one character to the right, StepIn to the left 97 | * Add support for StepInTargets: every word in the stopped line is considered one stack frame; StepInTargets returns targets for every character of the stack frame with the given frameId. 98 | 99 | ## 0.40.0 100 | * Exercise new dynamic debug config API. 101 | 102 | ## 0.39.0 103 | * Exercise progress events: typing "progress" in the REPL starts a sequence of (cancellable) progress events if the clients supports this via the `supportsProgressReporting` client capability. 104 | * Exersise new completion item attributes `selectionStart` and `selectionLength`: "array[]" moves cursor between the brackets and "func(arg)" selects "arg". 105 | 106 | ## 0.38.0 107 | * Exercise the new group feature of output events: 'log(start)' or 'log(startCollapsed)' starts a group, 'log(end)' ends a group. 108 | 109 | ## 0.37.0 110 | * Add a simple vscode.EvaluatableExpressionProvider to show how to control what gets shown in a debug hover. 111 | 112 | ## 0.36.0 113 | * Extend the run mode by an 'inline' run mode (in addition to 'external' and 'server'). 114 | 115 | ## 0.35.0 116 | * Support the 'breakpointLocations' request. 117 | * Make 'variables' request cancelable. 118 | 119 | ## 0.34.0 120 | * Add support for persisted data breakpoints. 121 | 122 | ## 0.33.0 123 | * Add support for (sorted) REPL completions. 124 | 125 | ## 0.32.0 126 | * Add support for data breakpoints. 127 | 128 | ## 0.31.0 129 | * Added code to show how to control what debug executable is used. 130 | 131 | ## 0.30.0 132 | * Updated dependencies. 133 | 134 | ## 0.29.0 135 | * Move off proposed API for the EMBED_DEBUG_ADAPTER mode: embedded debug adapter now uses vscode.DebugAdapterDescriptorFactory. 136 | 137 | ## 0.28.0 138 | * Update dependencies. 139 | 140 | ## 0.27.0 141 | * Update dependencies. 142 | 143 | ## 0.26.0 144 | * Improved the launch configuration snippet and added a `"stopOnEntry": true`. 145 | 146 | ## 0.25.0 147 | * Added the `"multi-root ready"` keyword. 148 | 149 | ## 0.24.0 150 | * Add support for starting a debug session without a launch configuration. 151 | * Require 1.17 version of VS Code. 152 | 153 | ## 0.23.0 154 | * Added supported for creating and deleting breakpoints from the REPL. Use `new 123` to create a breakpoint in line 123, and `del 123` to delete it. 155 | * Use 1.24.0 version of Debug Adapter Protocol and libraries. 156 | 157 | ## 0.22.0 158 | * Refactored the 'Mock Debugger' functionality into a separate class. This makes it more obvious how a debug adapter 'adapts' to a debugger or runtime. 159 | 160 | ## 0.21.0 161 | * Shows the source location of log output. A `log(any text)` in the input sends the text in parenthesis to the debug console. 162 | 163 | ## 0.20.0 164 | * Use 1.23.0 version of Debug Adapter Protocol and libraries. 165 | 166 | ## 0.19.0 167 | * Add tslint 168 | * Use 1.19.0 version of Debug Adapter Protocol and libraries. 169 | 170 | ## 0.18.2 171 | * Added 'trace' attribute to launch configuration: set it to 'true' to enable logging of the Debug Adapter Protocol. 172 | 173 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) Microsoft Corporation 2 | 3 | All rights reserved. 4 | 5 | MIT License 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all 15 | copies or substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 23 | SOFTWARE. 24 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /ThirdPartyNotices.txt: -------------------------------------------------------------------------------- 1 | THIRD-PARTY SOFTWARE NOTICES AND INFORMATION 2 | Do Not Translate or Localize 3 | 4 | This project incorporates material from the project(s) listed below (collectively, “Third Party Code”). 5 | Microsoft is not the original author of the Third Party Code. The original copyright notice and license 6 | under which Microsoft received such Third Party Code are set out below. This Third Party Code is licensed 7 | to you under their original license terms set forth below. Microsoft reserves all other rights not 8 | expressly granted, whether by implication, estoppel or otherwise. 9 | 10 | 11 | 1. DefinitelyTyped version 0.0.1 (https://github.com/borisyankov/DefinitelyTyped) 12 | 13 | 14 | %% DefinitelyTyped NOTICES AND INFORMATION BEGIN HERE 15 | ========================================= 16 | This project is licensed under the MIT license. 17 | Copyrights are respective of each contributor listed at the beginning of each definition file. 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | ========================================= 37 | END OF DefinitelyTyped NOTICES AND INFORMATION 38 | -------------------------------------------------------------------------------- /build/pre-release.yml: -------------------------------------------------------------------------------- 1 | name: $(Date:yyyyMMdd)$(Rev:.r) 2 | 3 | trigger: none 4 | pr: none 5 | 6 | resources: 7 | repositories: 8 | - repository: templates 9 | type: github 10 | name: microsoft/vscode-engineering 11 | ref: main 12 | endpoint: Monaco 13 | 14 | extends: 15 | template: azure-pipelines/extension/pre-release.yml@templates 16 | parameters: 17 | buildSteps: 18 | - script: yarn install --frozen-lockfile 19 | displayName: Install dependencies 20 | 21 | - script: yarn run test 22 | displayName: Typecheck extension 23 | 24 | tsa: 25 | config: 26 | serviceTreeID: '053e3ba6-924d-456c-ace0-67812c5ccc52' 27 | areaPath: 'Visual Studio Code Debugging Extensions' 28 | enabled: true -------------------------------------------------------------------------------- /build/stable.yml: -------------------------------------------------------------------------------- 1 | name: $(Date:yyyyMMdd)$(Rev:.r) 2 | 3 | trigger: 4 | branches: 5 | include: 6 | - main 7 | pr: none 8 | 9 | resources: 10 | repositories: 11 | - repository: templates 12 | type: github 13 | name: microsoft/vscode-engineering 14 | ref: main 15 | endpoint: Monaco 16 | 17 | parameters: 18 | - name: publishExtension 19 | displayName: 🚀 Publish Extension 20 | type: boolean 21 | default: false 22 | 23 | extends: 24 | template: azure-pipelines/extension/stable.yml@templates 25 | parameters: 26 | buildSteps: 27 | - script: yarn install --frozen-lockfile 28 | displayName: Install dependencies 29 | 30 | - script: yarn run test 31 | displayName: Typecheck extension 32 | 33 | tsa: 34 | config: 35 | serviceTreeID: '053e3ba6-924d-456c-ace0-67812c5ccc52' 36 | areaPath: 'Visual Studio Code Debugging Extensions' 37 | enabled: true 38 | 39 | publishExtension: ${{ parameters.publishExtension }} -------------------------------------------------------------------------------- /images/mock-debug-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-mock-debug/7e3c4279c76744680093fe97780f4ac07a3a3d5c/images/mock-debug-icon.png -------------------------------------------------------------------------------- /images/mock-debug.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/microsoft/vscode-mock-debug/7e3c4279c76744680093fe97780f4ac07a3a3d5c/images/mock-debug.gif -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mock-debug", 3 | "displayName": "Mock Debug", 4 | "version": "0.52.0", 5 | "publisher": "ms-vscode", 6 | "description": "Starter extension for developing debug adapters for VS Code.", 7 | "author": { 8 | "name": "Microsoft Corporation" 9 | }, 10 | "license": "MIT", 11 | "keywords": [ 12 | "multi-root ready" 13 | ], 14 | "engines": { 15 | "vscode": "^1.66.0" 16 | }, 17 | "icon": "images/mock-debug-icon.png", 18 | "categories": [ 19 | "Debuggers" 20 | ], 21 | "private": true, 22 | "repository": { 23 | "type": "git", 24 | "url": "https://github.com/Microsoft/vscode-mock-debug.git" 25 | }, 26 | "bugs": { 27 | "url": "https://github.com/Microsoft/vscode-mock-debug/issues" 28 | }, 29 | "scripts": { 30 | "compile": "tsc -p ./", 31 | "lint": "eslint src --ext ts", 32 | "typecheck": "tsc -p tsconfig.json --noEmit", 33 | "esbuild-base": "esbuild ./src/extension.ts --bundle --tsconfig=./tsconfig.json --external:vscode --format=cjs --platform=node --outfile=dist/extension.js", 34 | "watch": "npm run -S esbuild-base -- --sourcemap --sources-content=false --watch", 35 | "esbuild-web": "esbuild ./src/web-extension.ts --bundle --tsconfig=./tsconfig.json --external:vscode --format=cjs --platform=browser --outfile=dist/web-extension.js", 36 | "watch-web": "npm run -S esbuild-web -- --sourcemap --sources-content=false --watch", 37 | "build": "npm run -S esbuild-base -- --sourcemap --sources-content=false && npm run -S esbuild-web -- --sourcemap --sources-content=false", 38 | "package": "vsce package", 39 | "publish": "vsce publish", 40 | "publish-pre-release": "vsce publish --pre-release", 41 | "vscode:prepublish": "rimraf dist && npm run -S esbuild-base -- --minify && npm run -S esbuild-web -- --minify", 42 | "test": "npm run typecheck" 43 | }, 44 | "devDependencies": { 45 | "@types/glob": "^7.2.0", 46 | "@types/mocha": "^9.1.0", 47 | "@types/node": "^14.14.37", 48 | "@types/vscode": "^1.66.0", 49 | "@typescript-eslint/eslint-plugin": "^5.17.0", 50 | "@typescript-eslint/parser": "^5.17.0", 51 | "@vscode/debugadapter": "^1.56.0", 52 | "@vscode/debugadapter-testsupport": "^1.56.0", 53 | "await-notify": "^1.0.1", 54 | "base64-js": "^1.5.1", 55 | "esbuild": "^0.14.29", 56 | "eslint": "^8.12.0", 57 | "events": "^3.3.0", 58 | "glob": "^7.2.0", 59 | "mocha": "^9.2.2", 60 | "path-browserify": "^1.0.1", 61 | "rimraf": "^3.0.2", 62 | "typescript": "^4.6.3", 63 | "url": "^0.11.0", 64 | "vsce": "^2.7.0" 65 | }, 66 | "main": "./dist/extension.js", 67 | "browser": "./dist/web-extension.js", 68 | "activationEvents": [ 69 | "onDebugResolve:mock", 70 | "onDebugDynamicConfigurations:mock", 71 | "onCommand:extension.mock-debug.getProgramName" 72 | ], 73 | "workspaceTrust": { 74 | "request": "never" 75 | }, 76 | "contributes": { 77 | "menus": { 78 | "editor/title/run": [ 79 | { 80 | "command": "extension.mock-debug.runEditorContents", 81 | "when": "resourceLangId == markdown", 82 | "group": "navigation@1" 83 | }, 84 | { 85 | "command": "extension.mock-debug.debugEditorContents", 86 | "when": "resourceLangId == markdown", 87 | "group": "navigation@2" 88 | } 89 | ], 90 | "commandPalette": [ 91 | { 92 | "command": "extension.mock-debug.debugEditorContents", 93 | "when": "resourceLangId == markdown" 94 | }, 95 | { 96 | "command": "extension.mock-debug.runEditorContents", 97 | "when": "resourceLangId == markdown" 98 | } 99 | ], 100 | "debug/variables/context": [ 101 | { 102 | "command": "extension.mock-debug.toggleFormatting", 103 | "when": "debugType == 'mock' && debugProtocolVariableMenuContext == 'simple'" 104 | } 105 | ] 106 | }, 107 | "commands": [ 108 | { 109 | "command": "extension.mock-debug.debugEditorContents", 110 | "title": "Debug File", 111 | "category": "Mock Debug", 112 | "enablement": "!inDebugMode", 113 | "icon": "$(debug-alt)" 114 | }, 115 | { 116 | "command": "extension.mock-debug.runEditorContents", 117 | "title": "Run File", 118 | "category": "Mock Debug", 119 | "enablement": "!inDebugMode", 120 | "icon": "$(play)" 121 | }, 122 | { 123 | "command": "extension.mock-debug.toggleFormatting", 124 | "title": "Toggle between decimal and hex formatting" 125 | } 126 | ], 127 | "breakpoints": [ 128 | { 129 | "language": "markdown" 130 | } 131 | ], 132 | "debuggers": [ 133 | { 134 | "type": "mock", 135 | "languages": [ 136 | "markdown" 137 | ], 138 | "label": "Mock Debug", 139 | "program": "./out/debugAdapter.js", 140 | "runtime": "node", 141 | "configurationAttributes": { 142 | "launch": { 143 | "required": [ 144 | "program" 145 | ], 146 | "properties": { 147 | "program": { 148 | "type": "string", 149 | "description": "Absolute path to a text file.", 150 | "default": "${workspaceFolder}/${command:AskForProgramName}" 151 | }, 152 | "stopOnEntry": { 153 | "type": "boolean", 154 | "description": "Automatically stop after launch.", 155 | "default": true 156 | }, 157 | "trace": { 158 | "type": "boolean", 159 | "description": "Enable logging of the Debug Adapter Protocol.", 160 | "default": true 161 | }, 162 | "compileError": { 163 | "type": "string", 164 | "description": "Simulates a compile error in 'launch' request.", 165 | "enum": [ 166 | "default", 167 | "show", 168 | "hide" 169 | ], 170 | "enumDescriptions": [ 171 | "default: show fake compile error to user", 172 | "show fake compile error to user", 173 | "do not show fake compile error to user" 174 | ] 175 | } 176 | } 177 | }, 178 | "attach": { 179 | "required": [ 180 | "program" 181 | ], 182 | "properties": { 183 | "program": { 184 | "type": "string", 185 | "description": "Absolute path to a text file.", 186 | "default": "${workspaceFolder}/${command:AskForProgramName}" 187 | }, 188 | "stopOnEntry": { 189 | "type": "boolean", 190 | "description": "Automatically stop after attach.", 191 | "default": true 192 | }, 193 | "trace": { 194 | "type": "boolean", 195 | "description": "Enable logging of the Debug Adapter Protocol.", 196 | "default": true 197 | }, 198 | "compileError": { 199 | "type": "string", 200 | "description": "Simulates a compile error in 'attach' request.", 201 | "enum": [ 202 | "default", 203 | "show", 204 | "hide" 205 | ], 206 | "enumDescriptions": [ 207 | "default: show fake compile error to user", 208 | "show fake compile error to user", 209 | "do not show fake compile error to user" 210 | ] 211 | } 212 | } 213 | } 214 | }, 215 | "initialConfigurations": [ 216 | { 217 | "type": "mock", 218 | "request": "launch", 219 | "name": "Ask for file name", 220 | "program": "${workspaceFolder}/${command:AskForProgramName}", 221 | "stopOnEntry": true 222 | } 223 | ], 224 | "configurationSnippets": [ 225 | { 226 | "label": "Mock Debug: Launch", 227 | "description": "A new configuration for 'debugging' a user selected markdown file.", 228 | "body": { 229 | "type": "mock", 230 | "request": "launch", 231 | "name": "Ask for file name", 232 | "program": "^\"\\${workspaceFolder}/\\${command:AskForProgramName}\"", 233 | "stopOnEntry": true 234 | } 235 | } 236 | ], 237 | "variables": { 238 | "AskForProgramName": "extension.mock-debug.getProgramName" 239 | } 240 | } 241 | ] 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # VS Code Mock Debug 2 | 3 | This is a starter sample for developing VS Code debug adapters. 4 | 5 | **Mock Debug** simulates a debug adapter for Visual Studio Code. 6 | It supports *step*, *continue*, *breakpoints*, *exceptions*, and 7 | *variable access* but it is not connected to any real debugger. 8 | 9 | The sample is meant as an educational piece showing how to implement a debug 10 | adapter for VS Code. It can be used as a starting point for developing a real adapter. 11 | 12 | More information about how to develop a new debug adapter can be found 13 | [here](https://code.visualstudio.com/docs/extensions/example-debuggers). 14 | 15 | ## Using Mock Debug 16 | 17 | * Install the **Mock Debug** extension in VS Code. 18 | * Create a new 'program' file `readme.md` and enter several lines of arbitrary text. 19 | * Switch to the debug viewlet and press the gear dropdown. 20 | * Select the debug environment "Mock Debug". 21 | * Press the green 'play' button to start debugging. 22 | 23 | You can now 'step through' the `readme.md` file, set and hit breakpoints, and run into exceptions (if the word exception appears in a line). 24 | 25 | ![Mock Debug](images/mock-debug.gif) 26 | 27 | ## Build and Run 28 | 29 | * Clone the project [https://github.com/Microsoft/vscode-mock-debug.git](https://github.com/Microsoft/vscode-mock-debug.git) 30 | * Open the project folder in VS Code. 31 | * Press `F5` to build and launch Mock Debug in another VS Code window. 32 | * In the explorer view of the new window open the 'program' file `readme.md` 33 | * Set some breakpoints 34 | * From the editor's "Run and Debug" toolbar dropdown menu select "Debug File" -------------------------------------------------------------------------------- /sampleWorkspace/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "mock", 9 | "request": "launch", 10 | "name": "Debug readme.md", 11 | "program": "${workspaceFolder}/readme.md", 12 | "stopOnEntry": true, 13 | "trace": false 14 | }, 15 | { 16 | "type": "mock", 17 | "request": "attach", 18 | "name": "Attach readme.md", 19 | "program": "${workspaceFolder}/readme.md", 20 | "stopOnEntry": true, 21 | "trace": false 22 | } 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /sampleWorkspace/readme.md: -------------------------------------------------------------------------------- 1 | # VS Code Mock Debug 2 | 3 | Mock Debug allows to "debug" markdown files (like this). 4 | The text of the markdown is considered the "program to debug" and certain keywords trigger specific functionality (Yes, this language is not "Turing Complete" :-) 5 | 6 | ## Running or Debugging 7 | 8 | With the "Run/Debug" split button in the editor header you can easily "run" or "debug" a Markdown file without having to configure a debug configuration. 9 | "Running" a Markdown file has no visible effect. "Debugging" a Markdown file starts the debugger and stops on the first line. 10 | 11 | ## Stacks 12 | 13 | If debugging stops on a line, the line becomes a stack in the CALL STACK with the individual words shown as frames. 14 | The following line results in a long stack trace and shows the paging feature: 15 | a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z a b c d e f g h i j k l m n o p q r s t u v w x y z 16 | 17 | ## Variables 18 | 19 | Words starting with `$` are treated as variables. Letter casing doesn't matter. 20 | 21 | Writing to a variable is done with the `$variable=value` syntax. The format of the value determines the type of the variable. Here are examples for all types: 22 | - Integer: $i=123 23 | - String: $s="abc" 24 | - Boolean: $b1=true $b2=false 25 | - Float: $f=3.14 26 | - Object: $o={abc} 27 | 28 | Variables are shown in the VARIABLES view under the "Locals" and "Globals" scopes whenever the debugger stops. 29 | In addition a variable's value is shown when hovering over a variable and VS Code's Inline Values features shows the value at the end of the line. 30 | 31 | A variable where the name contains the string "lazy" will be shown in the VARIABLES view with a UI that requires an additional click to retrieve the value. Two examples: 32 | - Lazy Integer: $lazyInteger=999 33 | - Lazy Object: $lazyObject={foo} 34 | 35 | ## Breakpoints 36 | 37 | Breakpoints can be set in the breakpoint margin of the editor (even before a Mock Debug session was started). 38 | If a Mock Debug session is active, breakpoints are "validated" according to these rules: 39 | 40 | * if a line is empty or starts with `+` we don't allow to set a breakpoint but move the breakpoint down 41 | * if a line starts with `-` we don't allow to set a breakpoint but move the breakpoint up 42 | * a breakpoint on a line containing the word `lazy` is not immediately validated, but only after hitting it once. 43 | 44 | ## Data Breakpoints 45 | 46 | Data Breakpoints can be set for different access modes in the VARIABLES view of the editor via the context menu. 47 | The syntax `$variable` triggers a read access data breakpoint, the syntax `$variable=value` a write access data breakpoint. 48 | 49 | Examples: 50 | - Read Access: $i 51 | - Write Access: $i=999 52 | 53 | ## Disassembly View 54 | 55 | If a markdown line contains the word 'disassembly', the context menu's "Open Disassembly View" command is enabled and the Disassembly view shows (fake) assembly instructions and "instruction stepping" and "instruction breakpoints" are supported. 56 | 57 | ## Exceptions 58 | 59 | If a line contains the word `exception` or the pattern `exception(name)` an exception is thrown. 60 | To make the debugger stop when an exception is thrown, two "exception options" exist in the BREAKPOINTS view: 61 | - **Named Exception**: if enabled and configured with a condition (e.g. `xxx`) the debugger will break on the `exception(xxx)` pattern. 62 | - **Other Exceptions**: if enabled the debugger will break on the word `exception` and the `exception(...)` pattern. 63 | 64 | ## Output events 65 | 66 | * If a line containes patterns like `log(xxx)`, `prio(xxx)`, `out(xxx)`, or `err(xxx)` the argument `xxx` is shown in the debug console as follows: 67 | * **log**: text is shown in debug console's default color to indicate that it is received from the debugger itself 68 | * **prio**: text is shown as a notification to indicate that it is received from the debugger itself and has high priority 69 | * **out**: text is shown in blue to indicate program output received from "stdout" 70 | * **err**: text is shown in red to indicate program output received from "stderr" 71 | * If the argument `xxx` is `start` or `end`, a "log group" is started or ended. 72 | 73 | Some examples: 74 | ``` 75 | prio(a high priority message) 76 | out(some text from stdout) 77 | err(some text from stderr) 78 | 79 | log(start) 80 | log(some text in group) 81 | log(start) 82 | log(some text on level 2 group) 83 | log(more text on level 2 group) 84 | log(end) 85 | log(startCollapsed) 86 | log(some text on a collapsed group) 87 | log(end) 88 | log(more text in group) 89 | log(end) 90 | ```` 91 | 92 | ## The End -------------------------------------------------------------------------------- /src/activateMockDebug.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | /* 5 | * activateMockDebug.ts containes the shared extension code that can be executed both in node.js and the browser. 6 | */ 7 | 8 | 'use strict'; 9 | 10 | import * as vscode from 'vscode'; 11 | import { WorkspaceFolder, DebugConfiguration, ProviderResult, CancellationToken } from 'vscode'; 12 | import { MockDebugSession } from './mockDebug'; 13 | import { FileAccessor } from './mockRuntime'; 14 | 15 | export function activateMockDebug(context: vscode.ExtensionContext, factory?: vscode.DebugAdapterDescriptorFactory) { 16 | 17 | context.subscriptions.push( 18 | vscode.commands.registerCommand('extension.mock-debug.runEditorContents', (resource: vscode.Uri) => { 19 | let targetResource = resource; 20 | if (!targetResource && vscode.window.activeTextEditor) { 21 | targetResource = vscode.window.activeTextEditor.document.uri; 22 | } 23 | if (targetResource) { 24 | vscode.debug.startDebugging(undefined, { 25 | type: 'mock', 26 | name: 'Run File', 27 | request: 'launch', 28 | program: targetResource.fsPath 29 | }, 30 | { noDebug: true } 31 | ); 32 | } 33 | }), 34 | vscode.commands.registerCommand('extension.mock-debug.debugEditorContents', (resource: vscode.Uri) => { 35 | let targetResource = resource; 36 | if (!targetResource && vscode.window.activeTextEditor) { 37 | targetResource = vscode.window.activeTextEditor.document.uri; 38 | } 39 | if (targetResource) { 40 | vscode.debug.startDebugging(undefined, { 41 | type: 'mock', 42 | name: 'Debug File', 43 | request: 'launch', 44 | program: targetResource.fsPath, 45 | stopOnEntry: true 46 | }); 47 | } 48 | }), 49 | vscode.commands.registerCommand('extension.mock-debug.toggleFormatting', (variable) => { 50 | const ds = vscode.debug.activeDebugSession; 51 | if (ds) { 52 | ds.customRequest('toggleFormatting'); 53 | } 54 | }) 55 | ); 56 | 57 | context.subscriptions.push(vscode.commands.registerCommand('extension.mock-debug.getProgramName', config => { 58 | return vscode.window.showInputBox({ 59 | placeHolder: "Please enter the name of a markdown file in the workspace folder", 60 | value: "readme.md" 61 | }); 62 | })); 63 | 64 | // register a configuration provider for 'mock' debug type 65 | const provider = new MockConfigurationProvider(); 66 | context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('mock', provider)); 67 | 68 | // register a dynamic configuration provider for 'mock' debug type 69 | context.subscriptions.push(vscode.debug.registerDebugConfigurationProvider('mock', { 70 | provideDebugConfigurations(folder: WorkspaceFolder | undefined): ProviderResult { 71 | return [ 72 | { 73 | name: "Dynamic Launch", 74 | request: "launch", 75 | type: "mock", 76 | program: "${file}" 77 | }, 78 | { 79 | name: "Another Dynamic Launch", 80 | request: "launch", 81 | type: "mock", 82 | program: "${file}" 83 | }, 84 | { 85 | name: "Mock Launch", 86 | request: "launch", 87 | type: "mock", 88 | program: "${file}" 89 | } 90 | ]; 91 | } 92 | }, vscode.DebugConfigurationProviderTriggerKind.Dynamic)); 93 | 94 | if (!factory) { 95 | factory = new InlineDebugAdapterFactory(); 96 | } 97 | context.subscriptions.push(vscode.debug.registerDebugAdapterDescriptorFactory('mock', factory)); 98 | if ('dispose' in factory) { 99 | context.subscriptions.push(factory); 100 | } 101 | 102 | // override VS Code's default implementation of the debug hover 103 | // here we match only Mock "variables", that are words starting with an '$' 104 | context.subscriptions.push(vscode.languages.registerEvaluatableExpressionProvider('markdown', { 105 | provideEvaluatableExpression(document: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult { 106 | 107 | const VARIABLE_REGEXP = /\$[a-z][a-z0-9]*/ig; 108 | const line = document.lineAt(position.line).text; 109 | 110 | let m: RegExpExecArray | null; 111 | while (m = VARIABLE_REGEXP.exec(line)) { 112 | const varRange = new vscode.Range(position.line, m.index, position.line, m.index + m[0].length); 113 | 114 | if (varRange.contains(position)) { 115 | return new vscode.EvaluatableExpression(varRange); 116 | } 117 | } 118 | return undefined; 119 | } 120 | })); 121 | 122 | // override VS Code's default implementation of the "inline values" feature" 123 | context.subscriptions.push(vscode.languages.registerInlineValuesProvider('markdown', { 124 | 125 | provideInlineValues(document: vscode.TextDocument, viewport: vscode.Range, context: vscode.InlineValueContext) : vscode.ProviderResult { 126 | 127 | const allValues: vscode.InlineValue[] = []; 128 | 129 | for (let l = viewport.start.line; l <= context.stoppedLocation.end.line; l++) { 130 | const line = document.lineAt(l); 131 | var regExp = /\$([a-z][a-z0-9]*)/ig; // variables are words starting with '$' 132 | do { 133 | var m = regExp.exec(line.text); 134 | if (m) { 135 | const varName = m[1]; 136 | const varRange = new vscode.Range(l, m.index, l, m.index + varName.length); 137 | 138 | // some literal text 139 | //allValues.push(new vscode.InlineValueText(varRange, `${varName}: ${viewport.start.line}`)); 140 | 141 | // value found via variable lookup 142 | allValues.push(new vscode.InlineValueVariableLookup(varRange, varName, false)); 143 | 144 | // value determined via expression evaluation 145 | //allValues.push(new vscode.InlineValueEvaluatableExpression(varRange, varName)); 146 | } 147 | } while (m); 148 | } 149 | 150 | return allValues; 151 | } 152 | })); 153 | } 154 | 155 | class MockConfigurationProvider implements vscode.DebugConfigurationProvider { 156 | 157 | /** 158 | * Massage a debug configuration just before a debug session is being launched, 159 | * e.g. add all missing attributes to the debug configuration. 160 | */ 161 | resolveDebugConfiguration(folder: WorkspaceFolder | undefined, config: DebugConfiguration, token?: CancellationToken): ProviderResult { 162 | 163 | // if launch.json is missing or empty 164 | if (!config.type && !config.request && !config.name) { 165 | const editor = vscode.window.activeTextEditor; 166 | if (editor && editor.document.languageId === 'markdown') { 167 | config.type = 'mock'; 168 | config.name = 'Launch'; 169 | config.request = 'launch'; 170 | config.program = '${file}'; 171 | config.stopOnEntry = true; 172 | } 173 | } 174 | 175 | if (!config.program) { 176 | return vscode.window.showInformationMessage("Cannot find a program to debug").then(_ => { 177 | return undefined; // abort launch 178 | }); 179 | } 180 | 181 | return config; 182 | } 183 | } 184 | 185 | export const workspaceFileAccessor: FileAccessor = { 186 | isWindows: typeof process !== 'undefined' && process.platform === 'win32', 187 | async readFile(path: string): Promise { 188 | let uri: vscode.Uri; 189 | try { 190 | uri = pathToUri(path); 191 | } catch (e) { 192 | return new TextEncoder().encode(`cannot read '${path}'`); 193 | } 194 | 195 | return await vscode.workspace.fs.readFile(uri); 196 | }, 197 | async writeFile(path: string, contents: Uint8Array) { 198 | await vscode.workspace.fs.writeFile(pathToUri(path), contents); 199 | } 200 | }; 201 | 202 | function pathToUri(path: string) { 203 | try { 204 | return vscode.Uri.file(path); 205 | } catch (e) { 206 | return vscode.Uri.parse(path); 207 | } 208 | } 209 | 210 | class InlineDebugAdapterFactory implements vscode.DebugAdapterDescriptorFactory { 211 | 212 | createDebugAdapterDescriptor(_session: vscode.DebugSession): ProviderResult { 213 | return new vscode.DebugAdapterInlineImplementation(new MockDebugSession(workspaceFileAccessor)); 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /src/debugAdapter.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | 5 | import { MockDebugSession } from './mockDebug'; 6 | 7 | import { promises as fs } from 'fs'; 8 | import * as Net from 'net'; 9 | import { FileAccessor } from './mockRuntime'; 10 | 11 | /* 12 | * debugAdapter.js is the entrypoint of the debug adapter when it runs as a separate process. 13 | */ 14 | 15 | /* 16 | * Since here we run the debug adapter as a separate ("external") process, it has no access to VS Code API. 17 | * So we can only use node.js API for accessing files. 18 | */ 19 | const fsAccessor: FileAccessor = { 20 | isWindows: process.platform === 'win32', 21 | readFile(path: string): Promise { 22 | return fs.readFile(path); 23 | }, 24 | writeFile(path: string, contents: Uint8Array): Promise { 25 | return fs.writeFile(path, contents); 26 | } 27 | }; 28 | 29 | /* 30 | * When the debug adapter is run as an external process, 31 | * normally the helper function DebugSession.run(...) takes care of everything: 32 | * 33 | * MockDebugSession.run(MockDebugSession); 34 | * 35 | * but here the helper is not flexible enough to deal with a debug session constructors with a parameter. 36 | * So for now we copied and modified the helper: 37 | */ 38 | 39 | // first parse command line arguments to see whether the debug adapter should run as a server 40 | let port = 0; 41 | const args = process.argv.slice(2); 42 | args.forEach(function (val, index, array) { 43 | const portMatch = /^--server=(\d{4,5})$/.exec(val); 44 | if (portMatch) { 45 | port = parseInt(portMatch[1], 10); 46 | } 47 | }); 48 | 49 | if (port > 0) { 50 | 51 | // start a server that creates a new session for every connection request 52 | console.error(`waiting for debug protocol on port ${port}`); 53 | Net.createServer((socket) => { 54 | console.error('>> accepted connection from client'); 55 | socket.on('end', () => { 56 | console.error('>> client connection closed\n'); 57 | }); 58 | const session = new MockDebugSession(fsAccessor); 59 | session.setRunAsServer(true); 60 | session.start(socket, socket); 61 | }).listen(port); 62 | } else { 63 | 64 | // start a single session that communicates via stdin/stdout 65 | const session = new MockDebugSession(fsAccessor); 66 | process.on('SIGTERM', () => { 67 | session.shutdown(); 68 | }); 69 | session.start(process.stdin, process.stdout); 70 | } 71 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | /* 5 | * extension.ts (and activateMockDebug.ts) forms the "plugin" that plugs into VS Code and contains the code that 6 | * connects VS Code with the debug adapter. 7 | * 8 | * extension.ts contains code for launching the debug adapter in three different ways: 9 | * - as an external program communicating with VS Code via stdin/stdout, 10 | * - as a server process communicating with VS Code via sockets or named pipes, or 11 | * - as inlined code running in the extension itself (default). 12 | * 13 | * Since the code in extension.ts uses node.js APIs it cannot run in the browser. 14 | */ 15 | 16 | 'use strict'; 17 | 18 | import * as Net from 'net'; 19 | import * as vscode from 'vscode'; 20 | import { randomBytes } from 'crypto'; 21 | import { tmpdir } from 'os'; 22 | import { join } from 'path'; 23 | import { platform } from 'process'; 24 | import { ProviderResult } from 'vscode'; 25 | import { MockDebugSession } from './mockDebug'; 26 | import { activateMockDebug, workspaceFileAccessor } from './activateMockDebug'; 27 | 28 | /* 29 | * The compile time flag 'runMode' controls how the debug adapter is run. 30 | * Please note: the test suite only supports 'external' mode. 31 | */ 32 | const runMode: 'external' | 'server' | 'namedPipeServer' | 'inline' = 'inline'; 33 | 34 | export function activate(context: vscode.ExtensionContext) { 35 | 36 | // debug adapters can be run in different ways by using a vscode.DebugAdapterDescriptorFactory: 37 | switch (runMode) { 38 | case 'server': 39 | // run the debug adapter as a server inside the extension and communicate via a socket 40 | activateMockDebug(context, new MockDebugAdapterServerDescriptorFactory()); 41 | break; 42 | 43 | case 'namedPipeServer': 44 | // run the debug adapter as a server inside the extension and communicate via a named pipe (Windows) or UNIX domain socket (non-Windows) 45 | activateMockDebug(context, new MockDebugAdapterNamedPipeServerDescriptorFactory()); 46 | break; 47 | 48 | case 'external': default: 49 | // run the debug adapter as a separate process 50 | activateMockDebug(context, new DebugAdapterExecutableFactory()); 51 | break; 52 | 53 | case 'inline': 54 | // run the debug adapter inside the extension and directly talk to it 55 | activateMockDebug(context); 56 | break; 57 | } 58 | } 59 | 60 | export function deactivate() { 61 | // nothing to do 62 | } 63 | 64 | class DebugAdapterExecutableFactory implements vscode.DebugAdapterDescriptorFactory { 65 | 66 | // The following use of a DebugAdapter factory shows how to control what debug adapter executable is used. 67 | // Since the code implements the default behavior, it is absolutely not neccessary and we show it here only for educational purpose. 68 | 69 | createDebugAdapterDescriptor(_session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): ProviderResult { 70 | // param "executable" contains the executable optionally specified in the package.json (if any) 71 | 72 | // use the executable specified in the package.json if it exists or determine it based on some other information (e.g. the session) 73 | if (!executable) { 74 | const command = "absolute path to my DA executable"; 75 | const args = [ 76 | "some args", 77 | "another arg" 78 | ]; 79 | const options = { 80 | cwd: "working directory for executable", 81 | env: { "envVariable": "some value" } 82 | }; 83 | executable = new vscode.DebugAdapterExecutable(command, args, options); 84 | } 85 | 86 | // make VS Code launch the DA executable 87 | return executable; 88 | } 89 | } 90 | 91 | class MockDebugAdapterServerDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { 92 | 93 | private server?: Net.Server; 94 | 95 | createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult { 96 | 97 | if (!this.server) { 98 | // start listening on a random port 99 | this.server = Net.createServer(socket => { 100 | const session = new MockDebugSession(workspaceFileAccessor); 101 | session.setRunAsServer(true); 102 | session.start(socket as NodeJS.ReadableStream, socket); 103 | }).listen(0); 104 | } 105 | 106 | // make VS Code connect to debug server 107 | return new vscode.DebugAdapterServer((this.server.address() as Net.AddressInfo).port); 108 | } 109 | 110 | dispose() { 111 | if (this.server) { 112 | this.server.close(); 113 | } 114 | } 115 | } 116 | 117 | class MockDebugAdapterNamedPipeServerDescriptorFactory implements vscode.DebugAdapterDescriptorFactory { 118 | 119 | private server?: Net.Server; 120 | 121 | createDebugAdapterDescriptor(session: vscode.DebugSession, executable: vscode.DebugAdapterExecutable | undefined): vscode.ProviderResult { 122 | 123 | if (!this.server) { 124 | // start listening on a random named pipe path 125 | const pipeName = randomBytes(10).toString('utf8'); 126 | const pipePath = platform === "win32" ? join('\\\\.\\pipe\\', pipeName) : join(tmpdir(), pipeName); 127 | 128 | this.server = Net.createServer(socket => { 129 | const session = new MockDebugSession(workspaceFileAccessor); 130 | session.setRunAsServer(true); 131 | session.start(socket, socket); 132 | }).listen(pipePath); 133 | } 134 | 135 | // make VS Code connect to debug server 136 | return new vscode.DebugAdapterNamedPipeServer(this.server.address() as string); 137 | } 138 | 139 | dispose() { 140 | if (this.server) { 141 | this.server.close(); 142 | } 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /src/mockDebug.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | /* 5 | * mockDebug.ts implements the Debug Adapter that "adapts" or translates the Debug Adapter Protocol (DAP) used by the client (e.g. VS Code) 6 | * into requests and events of the real "execution engine" or "debugger" (here: class MockRuntime). 7 | * When implementing your own debugger extension for VS Code, most of the work will go into the Debug Adapter. 8 | * Since the Debug Adapter is independent from VS Code, it can be used in any client (IDE) supporting the Debug Adapter Protocol. 9 | * 10 | * The most important class of the Debug Adapter is the MockDebugSession which implements many DAP requests by talking to the MockRuntime. 11 | */ 12 | 13 | import { 14 | Logger, logger, 15 | LoggingDebugSession, 16 | InitializedEvent, TerminatedEvent, StoppedEvent, BreakpointEvent, OutputEvent, 17 | ProgressStartEvent, ProgressUpdateEvent, ProgressEndEvent, InvalidatedEvent, 18 | Thread, StackFrame, Scope, Source, Handles, Breakpoint, MemoryEvent 19 | } from '@vscode/debugadapter'; 20 | import { DebugProtocol } from '@vscode/debugprotocol'; 21 | import { basename } from 'path-browserify'; 22 | import { MockRuntime, IRuntimeBreakpoint, FileAccessor, RuntimeVariable, timeout, IRuntimeVariableType } from './mockRuntime'; 23 | import { Subject } from 'await-notify'; 24 | import * as base64 from 'base64-js'; 25 | 26 | /** 27 | * This interface describes the mock-debug specific launch attributes 28 | * (which are not part of the Debug Adapter Protocol). 29 | * The schema for these attributes lives in the package.json of the mock-debug extension. 30 | * The interface should always match this schema. 31 | */ 32 | interface ILaunchRequestArguments extends DebugProtocol.LaunchRequestArguments { 33 | /** An absolute path to the "program" to debug. */ 34 | program: string; 35 | /** Automatically stop target after launch. If not specified, target does not stop. */ 36 | stopOnEntry?: boolean; 37 | /** enable logging the Debug Adapter Protocol */ 38 | trace?: boolean; 39 | /** run without debugging */ 40 | noDebug?: boolean; 41 | /** if specified, results in a simulated compile error in launch. */ 42 | compileError?: 'default' | 'show' | 'hide'; 43 | } 44 | 45 | interface IAttachRequestArguments extends ILaunchRequestArguments { } 46 | 47 | 48 | export class MockDebugSession extends LoggingDebugSession { 49 | 50 | // we don't support multiple threads, so we can use a hardcoded ID for the default thread 51 | private static threadID = 1; 52 | 53 | // a Mock runtime (or debugger) 54 | private _runtime: MockRuntime; 55 | 56 | private _variableHandles = new Handles<'locals' | 'globals' | RuntimeVariable>(); 57 | 58 | private _configurationDone = new Subject(); 59 | 60 | private _cancellationTokens = new Map(); 61 | 62 | private _reportProgress = false; 63 | private _progressId = 10000; 64 | private _cancelledProgressId: string | undefined = undefined; 65 | private _isProgressCancellable = true; 66 | 67 | private _valuesInHex = false; 68 | private _useInvalidatedEvent = false; 69 | 70 | private _addressesInHex = true; 71 | 72 | /** 73 | * Creates a new debug adapter that is used for one debug session. 74 | * We configure the default implementation of a debug adapter here. 75 | */ 76 | public constructor(fileAccessor: FileAccessor) { 77 | super("mock-debug.txt"); 78 | 79 | // this debugger uses zero-based lines and columns 80 | this.setDebuggerLinesStartAt1(false); 81 | this.setDebuggerColumnsStartAt1(false); 82 | 83 | this._runtime = new MockRuntime(fileAccessor); 84 | 85 | // setup event handlers 86 | this._runtime.on('stopOnEntry', () => { 87 | this.sendEvent(new StoppedEvent('entry', MockDebugSession.threadID)); 88 | }); 89 | this._runtime.on('stopOnStep', () => { 90 | this.sendEvent(new StoppedEvent('step', MockDebugSession.threadID)); 91 | }); 92 | this._runtime.on('stopOnBreakpoint', () => { 93 | this.sendEvent(new StoppedEvent('breakpoint', MockDebugSession.threadID)); 94 | }); 95 | this._runtime.on('stopOnDataBreakpoint', () => { 96 | this.sendEvent(new StoppedEvent('data breakpoint', MockDebugSession.threadID)); 97 | }); 98 | this._runtime.on('stopOnInstructionBreakpoint', () => { 99 | this.sendEvent(new StoppedEvent('instruction breakpoint', MockDebugSession.threadID)); 100 | }); 101 | this._runtime.on('stopOnException', (exception) => { 102 | if (exception) { 103 | this.sendEvent(new StoppedEvent(`exception(${exception})`, MockDebugSession.threadID)); 104 | } else { 105 | this.sendEvent(new StoppedEvent('exception', MockDebugSession.threadID)); 106 | } 107 | }); 108 | this._runtime.on('breakpointValidated', (bp: IRuntimeBreakpoint) => { 109 | this.sendEvent(new BreakpointEvent('changed', { verified: bp.verified, id: bp.id } as DebugProtocol.Breakpoint)); 110 | }); 111 | this._runtime.on('output', (type, text, filePath, line, column) => { 112 | 113 | let category: string; 114 | switch(type) { 115 | case 'prio': category = 'important'; break; 116 | case 'out': category = 'stdout'; break; 117 | case 'err': category = 'stderr'; break; 118 | default: category = 'console'; break; 119 | } 120 | const e: DebugProtocol.OutputEvent = new OutputEvent(`${text}\n`, category); 121 | 122 | if (text === 'start' || text === 'startCollapsed' || text === 'end') { 123 | e.body.group = text; 124 | e.body.output = `group-${text}\n`; 125 | } 126 | 127 | e.body.source = this.createSource(filePath); 128 | e.body.line = this.convertDebuggerLineToClient(line); 129 | e.body.column = this.convertDebuggerColumnToClient(column); 130 | this.sendEvent(e); 131 | }); 132 | this._runtime.on('end', () => { 133 | this.sendEvent(new TerminatedEvent()); 134 | }); 135 | } 136 | 137 | /** 138 | * The 'initialize' request is the first request called by the frontend 139 | * to interrogate the features the debug adapter provides. 140 | */ 141 | protected initializeRequest(response: DebugProtocol.InitializeResponse, args: DebugProtocol.InitializeRequestArguments): void { 142 | 143 | if (args.supportsProgressReporting) { 144 | this._reportProgress = true; 145 | } 146 | if (args.supportsInvalidatedEvent) { 147 | this._useInvalidatedEvent = true; 148 | } 149 | 150 | // build and return the capabilities of this debug adapter: 151 | response.body = response.body || {}; 152 | 153 | // the adapter implements the configurationDone request. 154 | response.body.supportsConfigurationDoneRequest = true; 155 | 156 | // make VS Code use 'evaluate' when hovering over source 157 | response.body.supportsEvaluateForHovers = true; 158 | 159 | // make VS Code show a 'step back' button 160 | response.body.supportsStepBack = true; 161 | 162 | // make VS Code support data breakpoints 163 | response.body.supportsDataBreakpoints = true; 164 | 165 | // make VS Code support completion in REPL 166 | response.body.supportsCompletionsRequest = true; 167 | response.body.completionTriggerCharacters = [ ".", "[" ]; 168 | 169 | // make VS Code send cancel request 170 | response.body.supportsCancelRequest = true; 171 | 172 | // make VS Code send the breakpointLocations request 173 | response.body.supportsBreakpointLocationsRequest = true; 174 | 175 | // make VS Code provide "Step in Target" functionality 176 | response.body.supportsStepInTargetsRequest = true; 177 | 178 | // the adapter defines two exceptions filters, one with support for conditions. 179 | response.body.supportsExceptionFilterOptions = true; 180 | response.body.exceptionBreakpointFilters = [ 181 | { 182 | filter: 'namedException', 183 | label: "Named Exception", 184 | description: `Break on named exceptions. Enter the exception's name as the Condition.`, 185 | default: false, 186 | supportsCondition: true, 187 | conditionDescription: `Enter the exception's name` 188 | }, 189 | { 190 | filter: 'otherExceptions', 191 | label: "Other Exceptions", 192 | description: 'This is a other exception', 193 | default: true, 194 | supportsCondition: false 195 | } 196 | ]; 197 | 198 | // make VS Code send exceptionInfo request 199 | response.body.supportsExceptionInfoRequest = true; 200 | 201 | // make VS Code send setVariable request 202 | response.body.supportsSetVariable = true; 203 | 204 | // make VS Code send setExpression request 205 | response.body.supportsSetExpression = true; 206 | 207 | // make VS Code send disassemble request 208 | response.body.supportsDisassembleRequest = true; 209 | response.body.supportsSteppingGranularity = true; 210 | response.body.supportsInstructionBreakpoints = true; 211 | 212 | // make VS Code able to read and write variable memory 213 | response.body.supportsReadMemoryRequest = true; 214 | response.body.supportsWriteMemoryRequest = true; 215 | 216 | response.body.supportSuspendDebuggee = true; 217 | response.body.supportTerminateDebuggee = true; 218 | response.body.supportsFunctionBreakpoints = true; 219 | response.body.supportsDelayedStackTraceLoading = true; 220 | 221 | this.sendResponse(response); 222 | 223 | // since this debug adapter can accept configuration requests like 'setBreakpoint' at any time, 224 | // we request them early by sending an 'initializeRequest' to the frontend. 225 | // The frontend will end the configuration sequence by calling 'configurationDone' request. 226 | this.sendEvent(new InitializedEvent()); 227 | } 228 | 229 | /** 230 | * Called at the end of the configuration sequence. 231 | * Indicates that all breakpoints etc. have been sent to the DA and that the 'launch' can start. 232 | */ 233 | protected configurationDoneRequest(response: DebugProtocol.ConfigurationDoneResponse, args: DebugProtocol.ConfigurationDoneArguments): void { 234 | super.configurationDoneRequest(response, args); 235 | 236 | // notify the launchRequest that configuration has finished 237 | this._configurationDone.notify(); 238 | } 239 | 240 | protected disconnectRequest(response: DebugProtocol.DisconnectResponse, args: DebugProtocol.DisconnectArguments, request?: DebugProtocol.Request): void { 241 | console.log(`disconnectRequest suspend: ${args.suspendDebuggee}, terminate: ${args.terminateDebuggee}`); 242 | } 243 | 244 | protected async attachRequest(response: DebugProtocol.AttachResponse, args: IAttachRequestArguments) { 245 | return this.launchRequest(response, args); 246 | } 247 | 248 | protected async launchRequest(response: DebugProtocol.LaunchResponse, args: ILaunchRequestArguments) { 249 | 250 | // make sure to 'Stop' the buffered logging if 'trace' is not set 251 | logger.setup(args.trace ? Logger.LogLevel.Verbose : Logger.LogLevel.Stop, false); 252 | 253 | // wait 1 second until configuration has finished (and configurationDoneRequest has been called) 254 | await this._configurationDone.wait(1000); 255 | 256 | // start the program in the runtime 257 | await this._runtime.start(args.program, !!args.stopOnEntry, !args.noDebug); 258 | 259 | if (args.compileError) { 260 | // simulate a compile/build error in "launch" request: 261 | // the error should not result in a modal dialog since 'showUser' is set to false. 262 | // A missing 'showUser' should result in a modal dialog. 263 | this.sendErrorResponse(response, { 264 | id: 1001, 265 | format: `compile error: some fake error.`, 266 | showUser: args.compileError === 'show' ? true : (args.compileError === 'hide' ? false : undefined) 267 | }); 268 | } else { 269 | this.sendResponse(response); 270 | } 271 | } 272 | 273 | protected setFunctionBreakPointsRequest(response: DebugProtocol.SetFunctionBreakpointsResponse, args: DebugProtocol.SetFunctionBreakpointsArguments, request?: DebugProtocol.Request): void { 274 | this.sendResponse(response); 275 | } 276 | 277 | protected async setBreakPointsRequest(response: DebugProtocol.SetBreakpointsResponse, args: DebugProtocol.SetBreakpointsArguments): Promise { 278 | 279 | const path = args.source.path as string; 280 | const clientLines = args.lines || []; 281 | 282 | // clear all breakpoints for this file 283 | this._runtime.clearBreakpoints(path); 284 | 285 | // set and verify breakpoint locations 286 | const actualBreakpoints0 = clientLines.map(async l => { 287 | const { verified, line, id } = await this._runtime.setBreakPoint(path, this.convertClientLineToDebugger(l)); 288 | const bp = new Breakpoint(verified, this.convertDebuggerLineToClient(line)) as DebugProtocol.Breakpoint; 289 | bp.id = id; 290 | return bp; 291 | }); 292 | const actualBreakpoints = await Promise.all(actualBreakpoints0); 293 | 294 | // send back the actual breakpoint positions 295 | response.body = { 296 | breakpoints: actualBreakpoints 297 | }; 298 | this.sendResponse(response); 299 | } 300 | 301 | protected breakpointLocationsRequest(response: DebugProtocol.BreakpointLocationsResponse, args: DebugProtocol.BreakpointLocationsArguments, request?: DebugProtocol.Request): void { 302 | 303 | if (args.source.path) { 304 | const bps = this._runtime.getBreakpoints(args.source.path, this.convertClientLineToDebugger(args.line)); 305 | response.body = { 306 | breakpoints: bps.map(col => { 307 | return { 308 | line: args.line, 309 | column: this.convertDebuggerColumnToClient(col) 310 | }; 311 | }) 312 | }; 313 | } else { 314 | response.body = { 315 | breakpoints: [] 316 | }; 317 | } 318 | this.sendResponse(response); 319 | } 320 | 321 | protected async setExceptionBreakPointsRequest(response: DebugProtocol.SetExceptionBreakpointsResponse, args: DebugProtocol.SetExceptionBreakpointsArguments): Promise { 322 | 323 | let namedException: string | undefined = undefined; 324 | let otherExceptions = false; 325 | 326 | if (args.filterOptions) { 327 | for (const filterOption of args.filterOptions) { 328 | switch (filterOption.filterId) { 329 | case 'namedException': 330 | namedException = args.filterOptions[0].condition; 331 | break; 332 | case 'otherExceptions': 333 | otherExceptions = true; 334 | break; 335 | } 336 | } 337 | } 338 | 339 | if (args.filters) { 340 | if (args.filters.indexOf('otherExceptions') >= 0) { 341 | otherExceptions = true; 342 | } 343 | } 344 | 345 | this._runtime.setExceptionsFilters(namedException, otherExceptions); 346 | 347 | this.sendResponse(response); 348 | } 349 | 350 | protected exceptionInfoRequest(response: DebugProtocol.ExceptionInfoResponse, args: DebugProtocol.ExceptionInfoArguments) { 351 | response.body = { 352 | exceptionId: 'Exception ID', 353 | description: 'This is a descriptive description of the exception.', 354 | breakMode: 'always', 355 | details: { 356 | message: 'Message contained in the exception.', 357 | typeName: 'Short type name of the exception object', 358 | stackTrace: 'stack frame 1\nstack frame 2', 359 | } 360 | }; 361 | this.sendResponse(response); 362 | } 363 | 364 | protected threadsRequest(response: DebugProtocol.ThreadsResponse): void { 365 | 366 | // runtime supports no threads so just return a default thread. 367 | response.body = { 368 | threads: [ 369 | new Thread(MockDebugSession.threadID, "thread 1"), 370 | new Thread(MockDebugSession.threadID + 1, "thread 2"), 371 | ] 372 | }; 373 | this.sendResponse(response); 374 | } 375 | 376 | protected stackTraceRequest(response: DebugProtocol.StackTraceResponse, args: DebugProtocol.StackTraceArguments): void { 377 | 378 | const startFrame = typeof args.startFrame === 'number' ? args.startFrame : 0; 379 | const maxLevels = typeof args.levels === 'number' ? args.levels : 1000; 380 | const endFrame = startFrame + maxLevels; 381 | 382 | const stk = this._runtime.stack(startFrame, endFrame); 383 | 384 | response.body = { 385 | stackFrames: stk.frames.map((f, ix) => { 386 | const sf: DebugProtocol.StackFrame = new StackFrame(f.index, f.name, this.createSource(f.file), this.convertDebuggerLineToClient(f.line)); 387 | if (typeof f.column === 'number') { 388 | sf.column = this.convertDebuggerColumnToClient(f.column); 389 | } 390 | if (typeof f.instruction === 'number') { 391 | const address = this.formatAddress(f.instruction); 392 | sf.name = `${f.name} ${address}`; 393 | sf.instructionPointerReference = address; 394 | } 395 | 396 | return sf; 397 | }), 398 | // 4 options for 'totalFrames': 399 | //omit totalFrames property: // VS Code has to probe/guess. Should result in a max. of two requests 400 | totalFrames: stk.count // stk.count is the correct size, should result in a max. of two requests 401 | //totalFrames: 1000000 // not the correct size, should result in a max. of two requests 402 | //totalFrames: endFrame + 20 // dynamically increases the size with every requested chunk, results in paging 403 | }; 404 | this.sendResponse(response); 405 | } 406 | 407 | protected scopesRequest(response: DebugProtocol.ScopesResponse, args: DebugProtocol.ScopesArguments): void { 408 | 409 | response.body = { 410 | scopes: [ 411 | new Scope("Locals", this._variableHandles.create('locals'), false), 412 | new Scope("Globals", this._variableHandles.create('globals'), true) 413 | ] 414 | }; 415 | this.sendResponse(response); 416 | } 417 | 418 | protected async writeMemoryRequest(response: DebugProtocol.WriteMemoryResponse, { data, memoryReference, offset = 0 }: DebugProtocol.WriteMemoryArguments) { 419 | const variable = this._variableHandles.get(Number(memoryReference)); 420 | if (typeof variable === 'object') { 421 | const decoded = base64.toByteArray(data); 422 | variable.setMemory(decoded, offset); 423 | response.body = { bytesWritten: decoded.length }; 424 | } else { 425 | response.body = { bytesWritten: 0 }; 426 | } 427 | 428 | this.sendResponse(response); 429 | this.sendEvent(new InvalidatedEvent(['variables'])); 430 | } 431 | 432 | protected async readMemoryRequest(response: DebugProtocol.ReadMemoryResponse, { offset = 0, count, memoryReference }: DebugProtocol.ReadMemoryArguments) { 433 | const variable = this._variableHandles.get(Number(memoryReference)); 434 | if (typeof variable === 'object' && variable.memory) { 435 | const memory = variable.memory.subarray( 436 | Math.min(offset, variable.memory.length), 437 | Math.min(offset + count, variable.memory.length), 438 | ); 439 | 440 | response.body = { 441 | address: offset.toString(), 442 | data: base64.fromByteArray(memory), 443 | unreadableBytes: count - memory.length 444 | }; 445 | } else { 446 | response.body = { 447 | address: offset.toString(), 448 | data: '', 449 | unreadableBytes: count 450 | }; 451 | } 452 | 453 | this.sendResponse(response); 454 | } 455 | 456 | protected async variablesRequest(response: DebugProtocol.VariablesResponse, args: DebugProtocol.VariablesArguments, request?: DebugProtocol.Request): Promise { 457 | 458 | let vs: RuntimeVariable[] = []; 459 | 460 | const v = this._variableHandles.get(args.variablesReference); 461 | if (v === 'locals') { 462 | vs = this._runtime.getLocalVariables(); 463 | } else if (v === 'globals') { 464 | if (request) { 465 | this._cancellationTokens.set(request.seq, false); 466 | vs = await this._runtime.getGlobalVariables(() => !!this._cancellationTokens.get(request.seq)); 467 | this._cancellationTokens.delete(request.seq); 468 | } else { 469 | vs = await this._runtime.getGlobalVariables(); 470 | } 471 | } else if (v && Array.isArray(v.value)) { 472 | vs = v.value; 473 | } 474 | 475 | response.body = { 476 | variables: vs.map(v => this.convertFromRuntime(v)) 477 | }; 478 | this.sendResponse(response); 479 | } 480 | 481 | protected setVariableRequest(response: DebugProtocol.SetVariableResponse, args: DebugProtocol.SetVariableArguments): void { 482 | const container = this._variableHandles.get(args.variablesReference); 483 | const rv = container === 'locals' 484 | ? this._runtime.getLocalVariable(args.name) 485 | : container instanceof RuntimeVariable && container.value instanceof Array 486 | ? container.value.find(v => v.name === args.name) 487 | : undefined; 488 | 489 | if (rv) { 490 | rv.value = this.convertToRuntime(args.value); 491 | response.body = this.convertFromRuntime(rv); 492 | 493 | if (rv.memory && rv.reference) { 494 | this.sendEvent(new MemoryEvent(String(rv.reference), 0, rv.memory.length)); 495 | } 496 | } 497 | 498 | this.sendResponse(response); 499 | } 500 | 501 | protected continueRequest(response: DebugProtocol.ContinueResponse, args: DebugProtocol.ContinueArguments): void { 502 | this._runtime.continue(false); 503 | this.sendResponse(response); 504 | } 505 | 506 | protected reverseContinueRequest(response: DebugProtocol.ReverseContinueResponse, args: DebugProtocol.ReverseContinueArguments): void { 507 | this._runtime.continue(true); 508 | this.sendResponse(response); 509 | } 510 | 511 | protected nextRequest(response: DebugProtocol.NextResponse, args: DebugProtocol.NextArguments): void { 512 | this._runtime.step(args.granularity === 'instruction', false); 513 | this.sendResponse(response); 514 | } 515 | 516 | protected stepBackRequest(response: DebugProtocol.StepBackResponse, args: DebugProtocol.StepBackArguments): void { 517 | this._runtime.step(args.granularity === 'instruction', true); 518 | this.sendResponse(response); 519 | } 520 | 521 | protected stepInTargetsRequest(response: DebugProtocol.StepInTargetsResponse, args: DebugProtocol.StepInTargetsArguments) { 522 | const targets = this._runtime.getStepInTargets(args.frameId); 523 | response.body = { 524 | targets: targets.map(t => { 525 | return { id: t.id, label: t.label }; 526 | }) 527 | }; 528 | this.sendResponse(response); 529 | } 530 | 531 | protected stepInRequest(response: DebugProtocol.StepInResponse, args: DebugProtocol.StepInArguments): void { 532 | this._runtime.stepIn(args.targetId); 533 | this.sendResponse(response); 534 | } 535 | 536 | protected stepOutRequest(response: DebugProtocol.StepOutResponse, args: DebugProtocol.StepOutArguments): void { 537 | this._runtime.stepOut(); 538 | this.sendResponse(response); 539 | } 540 | 541 | protected async evaluateRequest(response: DebugProtocol.EvaluateResponse, args: DebugProtocol.EvaluateArguments): Promise { 542 | 543 | let reply: string | undefined; 544 | let rv: RuntimeVariable | undefined; 545 | 546 | switch (args.context) { 547 | case 'repl': 548 | // handle some REPL commands: 549 | // 'evaluate' supports to create and delete breakpoints from the 'repl': 550 | const matches = /new +([0-9]+)/.exec(args.expression); 551 | if (matches && matches.length === 2) { 552 | const mbp = await this._runtime.setBreakPoint(this._runtime.sourceFile, this.convertClientLineToDebugger(parseInt(matches[1]))); 553 | const bp = new Breakpoint(mbp.verified, this.convertDebuggerLineToClient(mbp.line), undefined, this.createSource(this._runtime.sourceFile)) as DebugProtocol.Breakpoint; 554 | bp.id= mbp.id; 555 | this.sendEvent(new BreakpointEvent('new', bp)); 556 | reply = `breakpoint created`; 557 | } else { 558 | const matches = /del +([0-9]+)/.exec(args.expression); 559 | if (matches && matches.length === 2) { 560 | const mbp = this._runtime.clearBreakPoint(this._runtime.sourceFile, this.convertClientLineToDebugger(parseInt(matches[1]))); 561 | if (mbp) { 562 | const bp = new Breakpoint(false) as DebugProtocol.Breakpoint; 563 | bp.id= mbp.id; 564 | this.sendEvent(new BreakpointEvent('removed', bp)); 565 | reply = `breakpoint deleted`; 566 | } 567 | } else { 568 | const matches = /progress/.exec(args.expression); 569 | if (matches && matches.length === 1) { 570 | if (this._reportProgress) { 571 | reply = `progress started`; 572 | this.progressSequence(); 573 | } else { 574 | reply = `frontend doesn't support progress (capability 'supportsProgressReporting' not set)`; 575 | } 576 | } 577 | } 578 | } 579 | // fall through 580 | 581 | default: 582 | if (args.expression.startsWith('$')) { 583 | rv = this._runtime.getLocalVariable(args.expression.substr(1)); 584 | } else { 585 | rv = new RuntimeVariable('eval', this.convertToRuntime(args.expression)); 586 | } 587 | break; 588 | } 589 | 590 | if (rv) { 591 | const v = this.convertFromRuntime(rv); 592 | response.body = { 593 | result: v.value, 594 | type: v.type, 595 | variablesReference: v.variablesReference, 596 | presentationHint: v.presentationHint 597 | }; 598 | } else { 599 | response.body = { 600 | result: reply ? reply : `evaluate(context: '${args.context}', '${args.expression}')`, 601 | variablesReference: 0 602 | }; 603 | } 604 | 605 | this.sendResponse(response); 606 | } 607 | 608 | protected setExpressionRequest(response: DebugProtocol.SetExpressionResponse, args: DebugProtocol.SetExpressionArguments): void { 609 | 610 | if (args.expression.startsWith('$')) { 611 | const rv = this._runtime.getLocalVariable(args.expression.substr(1)); 612 | if (rv) { 613 | rv.value = this.convertToRuntime(args.value); 614 | response.body = this.convertFromRuntime(rv); 615 | this.sendResponse(response); 616 | } else { 617 | this.sendErrorResponse(response, { 618 | id: 1002, 619 | format: `variable '{lexpr}' not found`, 620 | variables: { lexpr: args.expression }, 621 | showUser: true 622 | }); 623 | } 624 | } else { 625 | this.sendErrorResponse(response, { 626 | id: 1003, 627 | format: `'{lexpr}' not an assignable expression`, 628 | variables: { lexpr: args.expression }, 629 | showUser: true 630 | }); 631 | } 632 | } 633 | 634 | private async progressSequence() { 635 | 636 | const ID = '' + this._progressId++; 637 | 638 | await timeout(100); 639 | 640 | const title = this._isProgressCancellable ? 'Cancellable operation' : 'Long running operation'; 641 | const startEvent: DebugProtocol.ProgressStartEvent = new ProgressStartEvent(ID, title); 642 | startEvent.body.cancellable = this._isProgressCancellable; 643 | this._isProgressCancellable = !this._isProgressCancellable; 644 | this.sendEvent(startEvent); 645 | this.sendEvent(new OutputEvent(`start progress: ${ID}\n`)); 646 | 647 | let endMessage = 'progress ended'; 648 | 649 | for (let i = 0; i < 100; i++) { 650 | await timeout(500); 651 | this.sendEvent(new ProgressUpdateEvent(ID, `progress: ${i}`)); 652 | if (this._cancelledProgressId === ID) { 653 | endMessage = 'progress cancelled'; 654 | this._cancelledProgressId = undefined; 655 | this.sendEvent(new OutputEvent(`cancel progress: ${ID}\n`)); 656 | break; 657 | } 658 | } 659 | this.sendEvent(new ProgressEndEvent(ID, endMessage)); 660 | this.sendEvent(new OutputEvent(`end progress: ${ID}\n`)); 661 | 662 | this._cancelledProgressId = undefined; 663 | } 664 | 665 | protected dataBreakpointInfoRequest(response: DebugProtocol.DataBreakpointInfoResponse, args: DebugProtocol.DataBreakpointInfoArguments): void { 666 | 667 | response.body = { 668 | dataId: null, 669 | description: "cannot break on data access", 670 | accessTypes: undefined, 671 | canPersist: false 672 | }; 673 | 674 | if (args.variablesReference && args.name) { 675 | const v = this._variableHandles.get(args.variablesReference); 676 | if (v === 'globals') { 677 | response.body.dataId = args.name; 678 | response.body.description = args.name; 679 | response.body.accessTypes = [ "write" ]; 680 | response.body.canPersist = true; 681 | } else { 682 | response.body.dataId = args.name; 683 | response.body.description = args.name; 684 | response.body.accessTypes = ["read", "write", "readWrite"]; 685 | response.body.canPersist = true; 686 | } 687 | } 688 | 689 | this.sendResponse(response); 690 | } 691 | 692 | protected setDataBreakpointsRequest(response: DebugProtocol.SetDataBreakpointsResponse, args: DebugProtocol.SetDataBreakpointsArguments): void { 693 | 694 | // clear all data breakpoints 695 | this._runtime.clearAllDataBreakpoints(); 696 | 697 | response.body = { 698 | breakpoints: [] 699 | }; 700 | 701 | for (const dbp of args.breakpoints) { 702 | const ok = this._runtime.setDataBreakpoint(dbp.dataId, dbp.accessType || 'write'); 703 | response.body.breakpoints.push({ 704 | verified: ok 705 | }); 706 | } 707 | 708 | this.sendResponse(response); 709 | } 710 | 711 | protected completionsRequest(response: DebugProtocol.CompletionsResponse, args: DebugProtocol.CompletionsArguments): void { 712 | 713 | response.body = { 714 | targets: [ 715 | { 716 | label: "item 10", 717 | sortText: "10" 718 | }, 719 | { 720 | label: "item 1", 721 | sortText: "01", 722 | detail: "detail 1" 723 | }, 724 | { 725 | label: "item 2", 726 | sortText: "02", 727 | detail: "detail 2" 728 | }, 729 | { 730 | label: "array[]", 731 | selectionStart: 6, 732 | sortText: "03" 733 | }, 734 | { 735 | label: "func(arg)", 736 | selectionStart: 5, 737 | selectionLength: 3, 738 | sortText: "04" 739 | } 740 | ] 741 | }; 742 | this.sendResponse(response); 743 | } 744 | 745 | protected cancelRequest(response: DebugProtocol.CancelResponse, args: DebugProtocol.CancelArguments) { 746 | if (args.requestId) { 747 | this._cancellationTokens.set(args.requestId, true); 748 | } 749 | if (args.progressId) { 750 | this._cancelledProgressId= args.progressId; 751 | } 752 | } 753 | 754 | protected disassembleRequest(response: DebugProtocol.DisassembleResponse, args: DebugProtocol.DisassembleArguments) { 755 | const memoryInt = args.memoryReference.slice(3); 756 | const baseAddress = parseInt(memoryInt); 757 | const offset = args.instructionOffset || 0; 758 | const count = args.instructionCount; 759 | 760 | const isHex = memoryInt.startsWith('0x'); 761 | const pad = isHex ? memoryInt.length-2 : memoryInt.length; 762 | 763 | const loc = this.createSource(this._runtime.sourceFile); 764 | 765 | let lastLine = -1; 766 | 767 | const instructions = this._runtime.disassemble(baseAddress+offset, count).map(instruction => { 768 | let address = Math.abs(instruction.address).toString(isHex ? 16 : 10).padStart(pad, '0'); 769 | const sign = instruction.address < 0 ? '-' : ''; 770 | const instr : DebugProtocol.DisassembledInstruction = { 771 | address: sign + (isHex ? `0x${address}` : `${address}`), 772 | instruction: instruction.instruction 773 | }; 774 | // if instruction's source starts on a new line add the source to instruction 775 | if (instruction.line !== undefined && lastLine !== instruction.line) { 776 | lastLine = instruction.line; 777 | instr.location = loc; 778 | instr.line = this.convertDebuggerLineToClient(instruction.line); 779 | } 780 | return instr; 781 | }); 782 | 783 | response.body = { 784 | instructions: instructions 785 | }; 786 | this.sendResponse(response); 787 | } 788 | 789 | protected setInstructionBreakpointsRequest(response: DebugProtocol.SetInstructionBreakpointsResponse, args: DebugProtocol.SetInstructionBreakpointsArguments) { 790 | 791 | // clear all instruction breakpoints 792 | this._runtime.clearInstructionBreakpoints(); 793 | 794 | // set instruction breakpoints 795 | const breakpoints = args.breakpoints.map(ibp => { 796 | const address = parseInt(ibp.instructionReference.slice(3)); 797 | const offset = ibp.offset || 0; 798 | return { 799 | verified: this._runtime.setInstructionBreakpoint(address + offset) 800 | }; 801 | }); 802 | 803 | response.body = { 804 | breakpoints: breakpoints 805 | }; 806 | this.sendResponse(response); 807 | } 808 | 809 | protected customRequest(command: string, response: DebugProtocol.Response, args: any) { 810 | if (command === 'toggleFormatting') { 811 | this._valuesInHex = ! this._valuesInHex; 812 | if (this._useInvalidatedEvent) { 813 | this.sendEvent(new InvalidatedEvent( ['variables'] )); 814 | } 815 | this.sendResponse(response); 816 | } else { 817 | super.customRequest(command, response, args); 818 | } 819 | } 820 | 821 | //---- helpers 822 | 823 | private convertToRuntime(value: string): IRuntimeVariableType { 824 | 825 | value= value.trim(); 826 | 827 | if (value === 'true') { 828 | return true; 829 | } 830 | if (value === 'false') { 831 | return false; 832 | } 833 | if (value[0] === '\'' || value[0] === '"') { 834 | return value.substr(1, value.length-2); 835 | } 836 | const n = parseFloat(value); 837 | if (!isNaN(n)) { 838 | return n; 839 | } 840 | return value; 841 | } 842 | 843 | private convertFromRuntime(v: RuntimeVariable): DebugProtocol.Variable { 844 | 845 | let dapVariable: DebugProtocol.Variable = { 846 | name: v.name, 847 | value: '???', 848 | type: typeof v.value, 849 | variablesReference: 0, 850 | evaluateName: '$' + v.name 851 | }; 852 | 853 | if (v.name.indexOf('lazy') >= 0) { 854 | // a "lazy" variable needs an additional click to retrieve its value 855 | 856 | dapVariable.value = 'lazy var'; // placeholder value 857 | v.reference ??= this._variableHandles.create(new RuntimeVariable('', [ new RuntimeVariable('', v.value) ])); 858 | dapVariable.variablesReference = v.reference; 859 | dapVariable.presentationHint = { lazy: true }; 860 | } else { 861 | 862 | if (Array.isArray(v.value)) { 863 | dapVariable.value = 'Object'; 864 | v.reference ??= this._variableHandles.create(v); 865 | dapVariable.variablesReference = v.reference; 866 | } else { 867 | 868 | switch (typeof v.value) { 869 | case 'number': 870 | if (Math.round(v.value) === v.value) { 871 | dapVariable.value = this.formatNumber(v.value); 872 | (dapVariable).__vscodeVariableMenuContext = 'simple'; // enable context menu contribution 873 | dapVariable.type = 'integer'; 874 | } else { 875 | dapVariable.value = v.value.toString(); 876 | dapVariable.type = 'float'; 877 | } 878 | break; 879 | case 'string': 880 | dapVariable.value = `"${v.value}"`; 881 | break; 882 | case 'boolean': 883 | dapVariable.value = v.value ? 'true' : 'false'; 884 | break; 885 | default: 886 | dapVariable.value = typeof v.value; 887 | break; 888 | } 889 | } 890 | } 891 | 892 | if (v.memory) { 893 | v.reference ??= this._variableHandles.create(v); 894 | dapVariable.memoryReference = String(v.reference); 895 | } 896 | 897 | return dapVariable; 898 | } 899 | 900 | private formatAddress(x: number, pad = 8) { 901 | return 'mem' + (this._addressesInHex ? '0x' + x.toString(16).padStart(8, '0') : x.toString(10)); 902 | } 903 | 904 | private formatNumber(x: number) { 905 | return this._valuesInHex ? '0x' + x.toString(16) : x.toString(10); 906 | } 907 | 908 | private createSource(filePath: string): Source { 909 | return new Source(basename(filePath), this.convertDebuggerPathToClient(filePath), undefined, undefined, 'mock-adapter-data'); 910 | } 911 | } 912 | 913 | -------------------------------------------------------------------------------- /src/mockRuntime.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | 5 | import { EventEmitter } from 'events'; 6 | 7 | export interface FileAccessor { 8 | isWindows: boolean; 9 | readFile(path: string): Promise; 10 | writeFile(path: string, contents: Uint8Array): Promise; 11 | } 12 | 13 | export interface IRuntimeBreakpoint { 14 | id: number; 15 | line: number; 16 | verified: boolean; 17 | } 18 | 19 | interface IRuntimeStepInTargets { 20 | id: number; 21 | label: string; 22 | } 23 | 24 | interface IRuntimeStackFrame { 25 | index: number; 26 | name: string; 27 | file: string; 28 | line: number; 29 | column?: number; 30 | instruction?: number; 31 | } 32 | 33 | interface IRuntimeStack { 34 | count: number; 35 | frames: IRuntimeStackFrame[]; 36 | } 37 | 38 | interface RuntimeDisassembledInstruction { 39 | address: number; 40 | instruction: string; 41 | line?: number; 42 | } 43 | 44 | export type IRuntimeVariableType = number | boolean | string | RuntimeVariable[]; 45 | 46 | export class RuntimeVariable { 47 | private _memory?: Uint8Array; 48 | 49 | public reference?: number; 50 | 51 | public get value() { 52 | return this._value; 53 | } 54 | 55 | public set value(value: IRuntimeVariableType) { 56 | this._value = value; 57 | this._memory = undefined; 58 | } 59 | 60 | public get memory() { 61 | if (this._memory === undefined && typeof this._value === 'string') { 62 | this._memory = new TextEncoder().encode(this._value); 63 | } 64 | return this._memory; 65 | } 66 | 67 | constructor(public readonly name: string, private _value: IRuntimeVariableType) {} 68 | 69 | public setMemory(data: Uint8Array, offset = 0) { 70 | const memory = this.memory; 71 | if (!memory) { 72 | return; 73 | } 74 | 75 | memory.set(data, offset); 76 | this._memory = memory; 77 | this._value = new TextDecoder().decode(memory); 78 | } 79 | } 80 | 81 | interface Word { 82 | name: string; 83 | line: number; 84 | index: number; 85 | } 86 | 87 | export function timeout(ms: number) { 88 | return new Promise(resolve => setTimeout(resolve, ms)); 89 | } 90 | 91 | /** 92 | * A Mock runtime with minimal debugger functionality. 93 | * MockRuntime is a hypothetical (aka "Mock") "execution engine with debugging support": 94 | * it takes a Markdown (*.md) file and "executes" it by "running" through the text lines 95 | * and searching for "command" patterns that trigger some debugger related functionality (e.g. exceptions). 96 | * When it finds a command it typically emits an event. 97 | * The runtime can not only run through the whole file but also executes one line at a time 98 | * and stops on lines for which a breakpoint has been registered. This functionality is the 99 | * core of the "debugging support". 100 | * Since the MockRuntime is completely independent from VS Code or the Debug Adapter Protocol, 101 | * it can be viewed as a simplified representation of a real "execution engine" (e.g. node.js) 102 | * or debugger (e.g. gdb). 103 | * When implementing your own debugger extension for VS Code, you probably don't need this 104 | * class because you can rely on some existing debugger or runtime. 105 | */ 106 | export class MockRuntime extends EventEmitter { 107 | 108 | // the initial (and one and only) file we are 'debugging' 109 | private _sourceFile: string = ''; 110 | public get sourceFile() { 111 | return this._sourceFile; 112 | } 113 | 114 | private variables = new Map(); 115 | 116 | // the contents (= lines) of the one and only file 117 | private sourceLines: string[] = []; 118 | private instructions: Word[] = []; 119 | private starts: number[] = []; 120 | private ends: number[] = []; 121 | 122 | // This is the next line that will be 'executed' 123 | private _currentLine = 0; 124 | private get currentLine() { 125 | return this._currentLine; 126 | } 127 | private set currentLine(x) { 128 | this._currentLine = x; 129 | this.instruction = this.starts[x]; 130 | } 131 | private currentColumn: number | undefined; 132 | 133 | // This is the next instruction that will be 'executed' 134 | public instruction= 0; 135 | 136 | // maps from sourceFile to array of IRuntimeBreakpoint 137 | private breakPoints = new Map(); 138 | 139 | // all instruction breakpoint addresses 140 | private instructionBreakpoints = new Set(); 141 | 142 | // since we want to send breakpoint events, we will assign an id to every event 143 | // so that the frontend can match events with breakpoints. 144 | private breakpointId = 1; 145 | 146 | private breakAddresses = new Map(); 147 | 148 | private namedException: string | undefined; 149 | private otherExceptions = false; 150 | 151 | 152 | constructor(private fileAccessor: FileAccessor) { 153 | super(); 154 | } 155 | 156 | /** 157 | * Start executing the given program. 158 | */ 159 | public async start(program: string, stopOnEntry: boolean, debug: boolean): Promise { 160 | 161 | await this.loadSource(this.normalizePathAndCasing(program)); 162 | 163 | if (debug) { 164 | await this.verifyBreakpoints(this._sourceFile); 165 | 166 | if (stopOnEntry) { 167 | this.findNextStatement(false, 'stopOnEntry'); 168 | } else { 169 | // we just start to run until we hit a breakpoint, an exception, or the end of the program 170 | this.continue(false); 171 | } 172 | } else { 173 | this.continue(false); 174 | } 175 | } 176 | 177 | /** 178 | * Continue execution to the end/beginning. 179 | */ 180 | public continue(reverse: boolean) { 181 | 182 | while (!this.executeLine(this.currentLine, reverse)) { 183 | if (this.updateCurrentLine(reverse)) { 184 | break; 185 | } 186 | if (this.findNextStatement(reverse)) { 187 | break; 188 | } 189 | } 190 | } 191 | 192 | /** 193 | * Step to the next/previous non empty line. 194 | */ 195 | public step(instruction: boolean, reverse: boolean) { 196 | 197 | if (instruction) { 198 | if (reverse) { 199 | this.instruction--; 200 | } else { 201 | this.instruction++; 202 | } 203 | this.sendEvent('stopOnStep'); 204 | } else { 205 | if (!this.executeLine(this.currentLine, reverse)) { 206 | if (!this.updateCurrentLine(reverse)) { 207 | this.findNextStatement(reverse, 'stopOnStep'); 208 | } 209 | } 210 | } 211 | } 212 | 213 | private updateCurrentLine(reverse: boolean): boolean { 214 | if (reverse) { 215 | if (this.currentLine > 0) { 216 | this.currentLine--; 217 | } else { 218 | // no more lines: stop at first line 219 | this.currentLine = 0; 220 | this.currentColumn = undefined; 221 | this.sendEvent('stopOnEntry'); 222 | return true; 223 | } 224 | } else { 225 | if (this.currentLine < this.sourceLines.length-1) { 226 | this.currentLine++; 227 | } else { 228 | // no more lines: run to end 229 | this.currentColumn = undefined; 230 | this.sendEvent('end'); 231 | return true; 232 | } 233 | } 234 | return false; 235 | } 236 | 237 | /** 238 | * "Step into" for Mock debug means: go to next character 239 | */ 240 | public stepIn(targetId: number | undefined) { 241 | if (typeof targetId === 'number') { 242 | this.currentColumn = targetId; 243 | this.sendEvent('stopOnStep'); 244 | } else { 245 | if (typeof this.currentColumn === 'number') { 246 | if (this.currentColumn <= this.sourceLines[this.currentLine].length) { 247 | this.currentColumn += 1; 248 | } 249 | } else { 250 | this.currentColumn = 1; 251 | } 252 | this.sendEvent('stopOnStep'); 253 | } 254 | } 255 | 256 | /** 257 | * "Step out" for Mock debug means: go to previous character 258 | */ 259 | public stepOut() { 260 | if (typeof this.currentColumn === 'number') { 261 | this.currentColumn -= 1; 262 | if (this.currentColumn === 0) { 263 | this.currentColumn = undefined; 264 | } 265 | } 266 | this.sendEvent('stopOnStep'); 267 | } 268 | 269 | public getStepInTargets(frameId: number): IRuntimeStepInTargets[] { 270 | 271 | const line = this.getLine(); 272 | const words = this.getWords(this.currentLine, line); 273 | 274 | // return nothing if frameId is out of range 275 | if (frameId < 0 || frameId >= words.length) { 276 | return []; 277 | } 278 | 279 | const { name, index } = words[frameId]; 280 | 281 | // make every character of the frame a potential "step in" target 282 | return name.split('').map((c, ix) => { 283 | return { 284 | id: index + ix, 285 | label: `target: ${c}` 286 | }; 287 | }); 288 | } 289 | 290 | /** 291 | * Returns a fake 'stacktrace' where every 'stackframe' is a word from the current line. 292 | */ 293 | public stack(startFrame: number, endFrame: number): IRuntimeStack { 294 | 295 | const line = this.getLine(); 296 | const words = this.getWords(this.currentLine, line); 297 | words.push({ name: 'BOTTOM', line: -1, index: -1 }); // add a sentinel so that the stack is never empty... 298 | 299 | // if the line contains the word 'disassembly' we support to "disassemble" the line by adding an 'instruction' property to the stackframe 300 | const instruction = line.indexOf('disassembly') >= 0 ? this.instruction : undefined; 301 | 302 | const column = typeof this.currentColumn === 'number' ? this.currentColumn : undefined; 303 | 304 | const frames: IRuntimeStackFrame[] = []; 305 | // every word of the current line becomes a stack frame. 306 | for (let i = startFrame; i < Math.min(endFrame, words.length); i++) { 307 | 308 | const stackFrame: IRuntimeStackFrame = { 309 | index: i, 310 | name: `${words[i].name}(${i})`, // use a word of the line as the stackframe name 311 | file: this._sourceFile, 312 | line: this.currentLine, 313 | column: column, // words[i].index 314 | instruction: instruction ? instruction + i : 0 315 | }; 316 | 317 | frames.push(stackFrame); 318 | } 319 | 320 | return { 321 | frames: frames, 322 | count: words.length 323 | }; 324 | } 325 | 326 | /* 327 | * Determine possible column breakpoint positions for the given line. 328 | * Here we return the start location of words with more than 8 characters. 329 | */ 330 | public getBreakpoints(path: string, line: number): number[] { 331 | return this.getWords(line, this.getLine(line)).filter(w => w.name.length > 8).map(w => w.index); 332 | } 333 | 334 | /* 335 | * Set breakpoint in file with given line. 336 | */ 337 | public async setBreakPoint(path: string, line: number): Promise { 338 | path = this.normalizePathAndCasing(path); 339 | 340 | const bp: IRuntimeBreakpoint = { verified: false, line, id: this.breakpointId++ }; 341 | let bps = this.breakPoints.get(path); 342 | if (!bps) { 343 | bps = new Array(); 344 | this.breakPoints.set(path, bps); 345 | } 346 | bps.push(bp); 347 | 348 | await this.verifyBreakpoints(path); 349 | 350 | return bp; 351 | } 352 | 353 | /* 354 | * Clear breakpoint in file with given line. 355 | */ 356 | public clearBreakPoint(path: string, line: number): IRuntimeBreakpoint | undefined { 357 | const bps = this.breakPoints.get(this.normalizePathAndCasing(path)); 358 | if (bps) { 359 | const index = bps.findIndex(bp => bp.line === line); 360 | if (index >= 0) { 361 | const bp = bps[index]; 362 | bps.splice(index, 1); 363 | return bp; 364 | } 365 | } 366 | return undefined; 367 | } 368 | 369 | public clearBreakpoints(path: string): void { 370 | this.breakPoints.delete(this.normalizePathAndCasing(path)); 371 | } 372 | 373 | public setDataBreakpoint(address: string, accessType: 'read' | 'write' | 'readWrite'): boolean { 374 | 375 | const x = accessType === 'readWrite' ? 'read write' : accessType; 376 | 377 | const t = this.breakAddresses.get(address); 378 | if (t) { 379 | if (t !== x) { 380 | this.breakAddresses.set(address, 'read write'); 381 | } 382 | } else { 383 | this.breakAddresses.set(address, x); 384 | } 385 | return true; 386 | } 387 | 388 | public clearAllDataBreakpoints(): void { 389 | this.breakAddresses.clear(); 390 | } 391 | 392 | public setExceptionsFilters(namedException: string | undefined, otherExceptions: boolean): void { 393 | this.namedException = namedException; 394 | this.otherExceptions = otherExceptions; 395 | } 396 | 397 | public setInstructionBreakpoint(address: number): boolean { 398 | this.instructionBreakpoints.add(address); 399 | return true; 400 | } 401 | 402 | public clearInstructionBreakpoints(): void { 403 | this.instructionBreakpoints.clear(); 404 | } 405 | 406 | public async getGlobalVariables(cancellationToken?: () => boolean ): Promise { 407 | 408 | let a: RuntimeVariable[] = []; 409 | 410 | for (let i = 0; i < 10; i++) { 411 | a.push(new RuntimeVariable(`global_${i}`, i)); 412 | if (cancellationToken && cancellationToken()) { 413 | break; 414 | } 415 | await timeout(1000); 416 | } 417 | 418 | return a; 419 | } 420 | 421 | public getLocalVariables(): RuntimeVariable[] { 422 | return Array.from(this.variables, ([name, value]) => value); 423 | } 424 | 425 | public getLocalVariable(name: string): RuntimeVariable | undefined { 426 | return this.variables.get(name); 427 | } 428 | 429 | /** 430 | * Return words of the given address range as "instructions" 431 | */ 432 | public disassemble(address: number, instructionCount: number): RuntimeDisassembledInstruction[] { 433 | 434 | const instructions: RuntimeDisassembledInstruction[] = []; 435 | 436 | for (let a = address; a < address + instructionCount; a++) { 437 | if (a >= 0 && a < this.instructions.length) { 438 | instructions.push({ 439 | address: a, 440 | instruction: this.instructions[a].name, 441 | line: this.instructions[a].line 442 | }); 443 | } else { 444 | instructions.push({ 445 | address: a, 446 | instruction: 'nop' 447 | }); 448 | } 449 | } 450 | 451 | return instructions; 452 | } 453 | 454 | // private methods 455 | 456 | private getLine(line?: number): string { 457 | return this.sourceLines[line === undefined ? this.currentLine : line].trim(); 458 | } 459 | 460 | private getWords(l: number, line: string): Word[] { 461 | // break line into words 462 | const WORD_REGEXP = /[a-z]+/ig; 463 | const words: Word[] = []; 464 | let match: RegExpExecArray | null; 465 | while (match = WORD_REGEXP.exec(line)) { 466 | words.push({ name: match[0], line: l, index: match.index }); 467 | } 468 | return words; 469 | } 470 | 471 | private async loadSource(file: string): Promise { 472 | if (this._sourceFile !== file) { 473 | this._sourceFile = this.normalizePathAndCasing(file); 474 | this.initializeContents(await this.fileAccessor.readFile(file)); 475 | } 476 | } 477 | 478 | private initializeContents(memory: Uint8Array) { 479 | this.sourceLines = new TextDecoder().decode(memory).split(/\r?\n/); 480 | 481 | this.instructions = []; 482 | 483 | this.starts = []; 484 | this.instructions = []; 485 | this.ends = []; 486 | 487 | for (let l = 0; l < this.sourceLines.length; l++) { 488 | this.starts.push(this.instructions.length); 489 | const words = this.getWords(l, this.sourceLines[l]); 490 | for (let word of words) { 491 | this.instructions.push(word); 492 | } 493 | this.ends.push(this.instructions.length); 494 | } 495 | } 496 | 497 | /** 498 | * return true on stop 499 | */ 500 | private findNextStatement(reverse: boolean, stepEvent?: string): boolean { 501 | 502 | for (let ln = this.currentLine; reverse ? ln >= 0 : ln < this.sourceLines.length; reverse ? ln-- : ln++) { 503 | 504 | // is there a source breakpoint? 505 | const breakpoints = this.breakPoints.get(this._sourceFile); 506 | if (breakpoints) { 507 | const bps = breakpoints.filter(bp => bp.line === ln); 508 | if (bps.length > 0) { 509 | 510 | // send 'stopped' event 511 | this.sendEvent('stopOnBreakpoint'); 512 | 513 | // the following shows the use of 'breakpoint' events to update properties of a breakpoint in the UI 514 | // if breakpoint is not yet verified, verify it now and send a 'breakpoint' update event 515 | if (!bps[0].verified) { 516 | bps[0].verified = true; 517 | this.sendEvent('breakpointValidated', bps[0]); 518 | } 519 | 520 | this.currentLine = ln; 521 | return true; 522 | } 523 | } 524 | 525 | const line = this.getLine(ln); 526 | if (line.length > 0) { 527 | this.currentLine = ln; 528 | break; 529 | } 530 | } 531 | if (stepEvent) { 532 | this.sendEvent(stepEvent); 533 | return true; 534 | } 535 | return false; 536 | } 537 | 538 | /** 539 | * "execute a line" of the readme markdown. 540 | * Returns true if execution sent out a stopped event and needs to stop. 541 | */ 542 | private executeLine(ln: number, reverse: boolean): boolean { 543 | 544 | // first "execute" the instructions associated with this line and potentially hit instruction breakpoints 545 | while (reverse ? this.instruction >= this.starts[ln] : this.instruction < this.ends[ln]) { 546 | reverse ? this.instruction-- : this.instruction++; 547 | if (this.instructionBreakpoints.has(this.instruction)) { 548 | this.sendEvent('stopOnInstructionBreakpoint'); 549 | return true; 550 | } 551 | } 552 | 553 | const line = this.getLine(ln); 554 | 555 | // find variable accesses 556 | let reg0 = /\$([a-z][a-z0-9]*)(=(false|true|[0-9]+(\.[0-9]+)?|\".*\"|\{.*\}))?/ig; 557 | let matches0: RegExpExecArray | null; 558 | while (matches0 = reg0.exec(line)) { 559 | if (matches0.length === 5) { 560 | 561 | let access: string | undefined; 562 | 563 | const name = matches0[1]; 564 | const value = matches0[3]; 565 | 566 | let v = new RuntimeVariable(name, value); 567 | 568 | if (value && value.length > 0) { 569 | 570 | if (value === 'true') { 571 | v.value = true; 572 | } else if (value === 'false') { 573 | v.value = false; 574 | } else if (value[0] === '"') { 575 | v.value = value.slice(1, -1); 576 | } else if (value[0] === '{') { 577 | v.value = [ 578 | new RuntimeVariable('fBool', true), 579 | new RuntimeVariable('fInteger', 123), 580 | new RuntimeVariable('fString', 'hello'), 581 | new RuntimeVariable('flazyInteger', 321) 582 | ]; 583 | } else { 584 | v.value = parseFloat(value); 585 | } 586 | 587 | if (this.variables.has(name)) { 588 | // the first write access to a variable is the "declaration" and not a "write access" 589 | access = 'write'; 590 | } 591 | this.variables.set(name, v); 592 | } else { 593 | if (this.variables.has(name)) { 594 | // variable must exist in order to trigger a read access 595 | access = 'read'; 596 | } 597 | } 598 | 599 | const accessType = this.breakAddresses.get(name); 600 | if (access && accessType && accessType.indexOf(access) >= 0) { 601 | this.sendEvent('stopOnDataBreakpoint', access); 602 | return true; 603 | } 604 | } 605 | } 606 | 607 | // if 'log(...)' found in source -> send argument to debug console 608 | const reg1 = /(log|prio|out|err)\(([^\)]*)\)/g; 609 | let matches1: RegExpExecArray | null; 610 | while (matches1 = reg1.exec(line)) { 611 | if (matches1.length === 3) { 612 | this.sendEvent('output', matches1[1], matches1[2], this._sourceFile, ln, matches1.index); 613 | } 614 | } 615 | 616 | // if pattern 'exception(...)' found in source -> throw named exception 617 | const matches2 = /exception\((.*)\)/.exec(line); 618 | if (matches2 && matches2.length === 2) { 619 | const exception = matches2[1].trim(); 620 | if (this.namedException === exception) { 621 | this.sendEvent('stopOnException', exception); 622 | return true; 623 | } else { 624 | if (this.otherExceptions) { 625 | this.sendEvent('stopOnException', undefined); 626 | return true; 627 | } 628 | } 629 | } else { 630 | // if word 'exception' found in source -> throw exception 631 | if (line.indexOf('exception') >= 0) { 632 | if (this.otherExceptions) { 633 | this.sendEvent('stopOnException', undefined); 634 | return true; 635 | } 636 | } 637 | } 638 | 639 | // nothing interesting found -> continue 640 | return false; 641 | } 642 | 643 | private async verifyBreakpoints(path: string): Promise { 644 | 645 | const bps = this.breakPoints.get(path); 646 | if (bps) { 647 | await this.loadSource(path); 648 | bps.forEach(bp => { 649 | if (!bp.verified && bp.line < this.sourceLines.length) { 650 | const srcLine = this.getLine(bp.line); 651 | 652 | // if a line is empty or starts with '+' we don't allow to set a breakpoint but move the breakpoint down 653 | if (srcLine.length === 0 || srcLine.indexOf('+') === 0) { 654 | bp.line++; 655 | } 656 | // if a line starts with '-' we don't allow to set a breakpoint but move the breakpoint up 657 | if (srcLine.indexOf('-') === 0) { 658 | bp.line--; 659 | } 660 | // don't set 'verified' to true if the line contains the word 'lazy' 661 | // in this case the breakpoint will be verified 'lazy' after hitting it once. 662 | if (srcLine.indexOf('lazy') < 0) { 663 | bp.verified = true; 664 | this.sendEvent('breakpointValidated', bp); 665 | } 666 | } 667 | }); 668 | } 669 | } 670 | 671 | private sendEvent(event: string, ... args: any[]): void { 672 | setTimeout(() => { 673 | this.emit(event, ...args); 674 | }, 0); 675 | } 676 | 677 | private normalizePathAndCasing(path: string) { 678 | if (this.fileAccessor.isWindows) { 679 | return path.replace(/\//g, '\\').toLowerCase(); 680 | } else { 681 | return path.replace(/\\/g, '/'); 682 | } 683 | } 684 | } 685 | -------------------------------------------------------------------------------- /src/tests/adapter.test.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | *--------------------------------------------------------------------------------------------*/ 5 | 6 | import assert = require('assert'); 7 | import * as Path from 'path'; 8 | import {DebugClient} from '@vscode/debugadapter-testsupport'; 9 | import {DebugProtocol} from '@vscode/debugprotocol'; 10 | 11 | suite('Node Debug Adapter', () => { 12 | 13 | const DEBUG_ADAPTER = './out/debugAdapter.js'; 14 | 15 | const PROJECT_ROOT = Path.join(__dirname, '../../'); 16 | const DATA_ROOT = Path.join(PROJECT_ROOT, 'src/tests/data/'); 17 | 18 | 19 | let dc: DebugClient; 20 | 21 | setup( () => { 22 | dc = new DebugClient('node', DEBUG_ADAPTER, 'mock'); 23 | return dc.start(); 24 | }); 25 | 26 | teardown( () => dc.stop() ); 27 | 28 | 29 | suite('basic', () => { 30 | 31 | test('unknown request should produce error', done => { 32 | dc.send('illegal_request').then(() => { 33 | done(new Error("does not report error on unknown request")); 34 | }).catch(() => { 35 | done(); 36 | }); 37 | }); 38 | }); 39 | 40 | suite('initialize', () => { 41 | 42 | test('should return supported features', () => { 43 | return dc.initializeRequest().then(response => { 44 | response.body = response.body || {}; 45 | assert.equal(response.body.supportsConfigurationDoneRequest, true); 46 | }); 47 | }); 48 | 49 | test('should produce error for invalid \'pathFormat\'', done => { 50 | dc.initializeRequest({ 51 | adapterID: 'mock', 52 | linesStartAt1: true, 53 | columnsStartAt1: true, 54 | pathFormat: 'url' 55 | }).then(response => { 56 | done(new Error("does not report error on invalid 'pathFormat' attribute")); 57 | }).catch(err => { 58 | // error expected 59 | done(); 60 | }); 61 | }); 62 | }); 63 | 64 | suite('launch', () => { 65 | 66 | test('should run program to the end', () => { 67 | 68 | const PROGRAM = Path.join(DATA_ROOT, 'test.md'); 69 | 70 | return Promise.all([ 71 | dc.configurationSequence(), 72 | dc.launch({ program: PROGRAM }), 73 | dc.waitForEvent('terminated') 74 | ]); 75 | }); 76 | 77 | test('should stop on entry', () => { 78 | 79 | const PROGRAM = Path.join(DATA_ROOT, 'test.md'); 80 | const ENTRY_LINE = 1; 81 | 82 | return Promise.all([ 83 | dc.configurationSequence(), 84 | dc.launch({ program: PROGRAM, stopOnEntry: true }), 85 | dc.assertStoppedLocation('entry', { line: ENTRY_LINE } ) 86 | ]); 87 | }); 88 | }); 89 | 90 | suite('setBreakpoints', () => { 91 | 92 | test('should stop on a breakpoint', () => { 93 | 94 | const PROGRAM = Path.join(DATA_ROOT, 'test.md'); 95 | const BREAKPOINT_LINE = 2; 96 | 97 | return dc.hitBreakpoint({ program: PROGRAM }, { path: PROGRAM, line: BREAKPOINT_LINE } ); 98 | }); 99 | 100 | test('hitting a lazy breakpoint should send a breakpoint event', () => { 101 | 102 | const PROGRAM = Path.join(DATA_ROOT, 'testLazyBreakpoint.md'); 103 | const BREAKPOINT_LINE = 3; 104 | 105 | return Promise.all([ 106 | 107 | dc.hitBreakpoint({ program: PROGRAM }, { path: PROGRAM, line: BREAKPOINT_LINE, verified: false } ), 108 | 109 | dc.waitForEvent('breakpoint').then(event => { 110 | const bpevent = event as DebugProtocol.BreakpointEvent; 111 | assert.strictEqual(bpevent.body.breakpoint.verified, true, "event mismatch: verified"); 112 | }) 113 | ]); 114 | }); 115 | }); 116 | 117 | suite('setExceptionBreakpoints', () => { 118 | 119 | test('should stop on an exception', () => { 120 | 121 | const PROGRAM_WITH_EXCEPTION = Path.join(DATA_ROOT, 'testWithException.md'); 122 | const EXCEPTION_LINE = 4; 123 | 124 | return Promise.all([ 125 | 126 | dc.waitForEvent('initialized').then(event => { 127 | return dc.setExceptionBreakpointsRequest({ 128 | filters: [ 'otherExceptions' ] 129 | }); 130 | }).then(response => { 131 | return dc.configurationDoneRequest(); 132 | }), 133 | 134 | dc.launch({ program: PROGRAM_WITH_EXCEPTION }), 135 | 136 | dc.assertStoppedLocation('exception', { line: EXCEPTION_LINE } ) 137 | ]); 138 | }); 139 | }); 140 | }); -------------------------------------------------------------------------------- /src/tests/data/test.md: -------------------------------------------------------------------------------- 1 | line 1 2 | line 2 3 | line 3 4 | line 4 5 | line 5 -------------------------------------------------------------------------------- /src/tests/data/testLazyBreakpoint.md: -------------------------------------------------------------------------------- 1 | line 1 2 | line 2 3 | line 3 lazy 4 | line 4 5 | line 5 -------------------------------------------------------------------------------- /src/tests/data/testWithException.md: -------------------------------------------------------------------------------- 1 | line 1 2 | line 2 3 | line 3 4 | line 4 with exception 5 | line 5 -------------------------------------------------------------------------------- /src/web-extension.ts: -------------------------------------------------------------------------------- 1 | /*--------------------------------------------------------- 2 | * Copyright (C) Microsoft Corporation. All rights reserved. 3 | *--------------------------------------------------------*/ 4 | /* 5 | * web-extension.ts (and activateMockDebug.ts) forms the "plugin" that plugs into VS Code and contains the code that 6 | * connects VS Code with the debug adapter. 7 | * 8 | * web-extension.ts launches the debug adapter "inlined" because that's the only supported mode for running the debug adapter in the browser. 9 | */ 10 | 11 | import * as vscode from 'vscode'; 12 | import { activateMockDebug } from './activateMockDebug'; 13 | 14 | export function activate(context: vscode.ExtensionContext) { 15 | activateMockDebug(context); // activateMockDebug without 2nd argument launches the Debug Adapter "inlined" 16 | } 17 | 18 | export function deactivate() { 19 | // nothing to do 20 | } 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2020", 5 | "outDir": "out", 6 | "lib": [ 7 | "WebWorker", 8 | "ES2020" 9 | ], 10 | "sourceMap": true, 11 | "rootDir": "src", 12 | "strict": true, /* enable all strict type-checking options */ 13 | /* Additional Checks */ 14 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 15 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 16 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 17 | 18 | "noImplicitAny": false, 19 | "removeComments": false, 20 | "noUnusedLocals": true, 21 | "noImplicitThis": true, 22 | "inlineSourceMap": false, 23 | "preserveConstEnums": true, 24 | "strictNullChecks": true, 25 | "noUnusedParameters": false 26 | }, 27 | "exclude": [ 28 | "node_modules" 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@eslint/eslintrc@^1.2.1": 6 | version "1.2.1" 7 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.1.tgz#8b5e1c49f4077235516bc9ec7d41378c0f69b8c6" 8 | integrity sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ== 9 | dependencies: 10 | ajv "^6.12.4" 11 | debug "^4.3.2" 12 | espree "^9.3.1" 13 | globals "^13.9.0" 14 | ignore "^5.2.0" 15 | import-fresh "^3.2.1" 16 | js-yaml "^4.1.0" 17 | minimatch "^3.0.4" 18 | strip-json-comments "^3.1.1" 19 | 20 | "@humanwhocodes/config-array@^0.9.2": 21 | version "0.9.3" 22 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.3.tgz#f2564c744b387775b436418491f15fce6601f63e" 23 | integrity sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ== 24 | dependencies: 25 | "@humanwhocodes/object-schema" "^1.2.1" 26 | debug "^4.1.1" 27 | minimatch "^3.0.4" 28 | 29 | "@humanwhocodes/object-schema@^1.2.1": 30 | version "1.2.1" 31 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" 32 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 33 | 34 | "@nodelib/fs.scandir@2.1.4": 35 | version "2.1.4" 36 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" 37 | integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== 38 | dependencies: 39 | "@nodelib/fs.stat" "2.0.4" 40 | run-parallel "^1.1.9" 41 | 42 | "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": 43 | version "2.0.4" 44 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" 45 | integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== 46 | 47 | "@nodelib/fs.walk@^1.2.3": 48 | version "1.2.6" 49 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" 50 | integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== 51 | dependencies: 52 | "@nodelib/fs.scandir" "2.1.4" 53 | fastq "^1.6.0" 54 | 55 | "@types/color-name@^1.1.1": 56 | version "1.1.1" 57 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 58 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 59 | 60 | "@types/glob@^7.2.0": 61 | version "7.2.0" 62 | resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" 63 | integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== 64 | dependencies: 65 | "@types/minimatch" "*" 66 | "@types/node" "*" 67 | 68 | "@types/json-schema@^7.0.9": 69 | version "7.0.9" 70 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" 71 | integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== 72 | 73 | "@types/minimatch@*": 74 | version "3.0.3" 75 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 76 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 77 | 78 | "@types/mocha@^9.1.0": 79 | version "9.1.0" 80 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.0.tgz#baf17ab2cca3fcce2d322ebc30454bff487efad5" 81 | integrity sha512-QCWHkbMv4Y5U9oW10Uxbr45qMMSzl4OzijsozynUAgx3kEHUdXB00udx2dWDQ7f2TU2a2uuiFaRZjCe3unPpeg== 82 | 83 | "@types/node@*": 84 | version "14.0.27" 85 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" 86 | integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== 87 | 88 | "@types/node@^14.14.37": 89 | version "14.14.37" 90 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" 91 | integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== 92 | 93 | "@types/vscode@^1.66.0": 94 | version "1.66.0" 95 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.66.0.tgz#e90e1308ad103f2bd31b72c17b8031b4cec0713d" 96 | integrity sha512-ZfJck4M7nrGasfs4A4YbUoxis3Vu24cETw3DERsNYtDZmYSYtk6ljKexKFKhImO/ZmY6ZMsmegu2FPkXoUFImA== 97 | 98 | "@typescript-eslint/eslint-plugin@^5.17.0": 99 | version "5.17.0" 100 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.17.0.tgz#704eb4e75039000531255672bf1c85ee85cf1d67" 101 | integrity sha512-qVstvQilEd89HJk3qcbKt/zZrfBZ+9h2ynpAGlWjWiizA7m/MtLT9RoX6gjtpE500vfIg8jogAkDzdCxbsFASQ== 102 | dependencies: 103 | "@typescript-eslint/scope-manager" "5.17.0" 104 | "@typescript-eslint/type-utils" "5.17.0" 105 | "@typescript-eslint/utils" "5.17.0" 106 | debug "^4.3.2" 107 | functional-red-black-tree "^1.0.1" 108 | ignore "^5.1.8" 109 | regexpp "^3.2.0" 110 | semver "^7.3.5" 111 | tsutils "^3.21.0" 112 | 113 | "@typescript-eslint/parser@^5.17.0": 114 | version "5.17.0" 115 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.17.0.tgz#7def77d5bcd8458d12d52909118cf3f0a45f89d5" 116 | integrity sha512-aRzW9Jg5Rlj2t2/crzhA2f23SIYFlF9mchGudyP0uiD6SenIxzKoLjwzHbafgHn39dNV/TV7xwQkLfFTZlJ4ig== 117 | dependencies: 118 | "@typescript-eslint/scope-manager" "5.17.0" 119 | "@typescript-eslint/types" "5.17.0" 120 | "@typescript-eslint/typescript-estree" "5.17.0" 121 | debug "^4.3.2" 122 | 123 | "@typescript-eslint/scope-manager@5.17.0": 124 | version "5.17.0" 125 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.17.0.tgz#4cea7d0e0bc0e79eb60cad431c89120987c3f952" 126 | integrity sha512-062iCYQF/doQ9T2WWfJohQKKN1zmmXVfAcS3xaiialiw8ZUGy05Em6QVNYJGO34/sU1a7a+90U3dUNfqUDHr3w== 127 | dependencies: 128 | "@typescript-eslint/types" "5.17.0" 129 | "@typescript-eslint/visitor-keys" "5.17.0" 130 | 131 | "@typescript-eslint/type-utils@5.17.0": 132 | version "5.17.0" 133 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.17.0.tgz#1c4549d68c89877662224aabb29fbbebf5fc9672" 134 | integrity sha512-3hU0RynUIlEuqMJA7dragb0/75gZmwNwFf/QJokWzPehTZousP/MNifVSgjxNcDCkM5HI2K22TjQWUmmHUINSg== 135 | dependencies: 136 | "@typescript-eslint/utils" "5.17.0" 137 | debug "^4.3.2" 138 | tsutils "^3.21.0" 139 | 140 | "@typescript-eslint/types@5.17.0": 141 | version "5.17.0" 142 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.17.0.tgz#861ec9e669ffa2aa9b873dd4d28d9b1ce26d216f" 143 | integrity sha512-AgQ4rWzmCxOZLioFEjlzOI3Ch8giDWx8aUDxyNw9iOeCvD3GEYAB7dxWGQy4T/rPVe8iPmu73jPHuaSqcjKvxw== 144 | 145 | "@typescript-eslint/typescript-estree@5.17.0": 146 | version "5.17.0" 147 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.17.0.tgz#a7cba7dfc8f9cc2ac78c18584e684507df4f2488" 148 | integrity sha512-X1gtjEcmM7Je+qJRhq7ZAAaNXYhTgqMkR10euC4Si6PIjb+kwEQHSxGazXUQXFyqfEXdkGf6JijUu5R0uceQzg== 149 | dependencies: 150 | "@typescript-eslint/types" "5.17.0" 151 | "@typescript-eslint/visitor-keys" "5.17.0" 152 | debug "^4.3.2" 153 | globby "^11.0.4" 154 | is-glob "^4.0.3" 155 | semver "^7.3.5" 156 | tsutils "^3.21.0" 157 | 158 | "@typescript-eslint/utils@5.17.0": 159 | version "5.17.0" 160 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.17.0.tgz#549a9e1d491c6ccd3624bc3c1b098f5cfb45f306" 161 | integrity sha512-DVvndq1QoxQH+hFv+MUQHrrWZ7gQ5KcJzyjhzcqB1Y2Xes1UQQkTRPUfRpqhS8mhTWsSb2+iyvDW1Lef5DD7vA== 162 | dependencies: 163 | "@types/json-schema" "^7.0.9" 164 | "@typescript-eslint/scope-manager" "5.17.0" 165 | "@typescript-eslint/types" "5.17.0" 166 | "@typescript-eslint/typescript-estree" "5.17.0" 167 | eslint-scope "^5.1.1" 168 | eslint-utils "^3.0.0" 169 | 170 | "@typescript-eslint/visitor-keys@5.17.0": 171 | version "5.17.0" 172 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.17.0.tgz#52daae45c61b0211b4c81b53a71841911e479128" 173 | integrity sha512-6K/zlc4OfCagUu7Am/BD5k8PSWQOgh34Nrv9Rxe2tBzlJ7uOeJ/h7ugCGDCeEZHT6k2CJBhbk9IsbkPI0uvUkA== 174 | dependencies: 175 | "@typescript-eslint/types" "5.17.0" 176 | eslint-visitor-keys "^3.0.0" 177 | 178 | "@ungap/promise-all-settled@1.1.2": 179 | version "1.1.2" 180 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 181 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 182 | 183 | "@vscode/debugadapter-testsupport@^1.56.0": 184 | version "1.56.0" 185 | resolved "https://registry.yarnpkg.com/@vscode/debugadapter-testsupport/-/debugadapter-testsupport-1.56.0.tgz#f0bd47a9e4ea5f231904284976f45e4d80fc9534" 186 | integrity sha512-epCgaAQN2VvHS7zg9gKdqXF86tpAxEiFZ2Nvajz6hO2CXPqID9LZdld06Ss1dcqDoV/Pca/OeF7hQvcEEHBMvg== 187 | dependencies: 188 | "@vscode/debugprotocol" "1.56.0" 189 | 190 | "@vscode/debugadapter@^1.56.0": 191 | version "1.56.0" 192 | resolved "https://registry.yarnpkg.com/@vscode/debugadapter/-/debugadapter-1.56.0.tgz#bba27d8ae17e74afef134322f63ce75532c9fc7c" 193 | integrity sha512-ObPrhQsqwJmIhObK3z6Wwaz/4JoZkS4D8f6uofkLqW+Bi/Atn6oCdgQC9PuFboQtsXXGMnFHibq0wPBKZvjW6w== 194 | dependencies: 195 | "@vscode/debugprotocol" "1.56.0" 196 | 197 | "@vscode/debugprotocol@1.56.0": 198 | version "1.56.0" 199 | resolved "https://registry.yarnpkg.com/@vscode/debugprotocol/-/debugprotocol-1.56.0.tgz#1fe42845dd5e279a213057a8643f134619a955c4" 200 | integrity sha512-hM+LlYNimM5HxoWG5lvNYIStjsKJdKE/4nwOIYaAjr/M7Cb5bFaJcHfkcdTJZAZejao/ueakuZ0Iq3JkC1avcQ== 201 | 202 | acorn-jsx@^5.3.1: 203 | version "5.3.1" 204 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" 205 | integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== 206 | 207 | acorn@^8.7.0: 208 | version "8.7.0" 209 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" 210 | integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== 211 | 212 | ajv@^6.10.0: 213 | version "6.12.3" 214 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" 215 | integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== 216 | dependencies: 217 | fast-deep-equal "^3.1.1" 218 | fast-json-stable-stringify "^2.0.0" 219 | json-schema-traverse "^0.4.1" 220 | uri-js "^4.2.2" 221 | 222 | ajv@^6.12.4: 223 | version "6.12.6" 224 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 225 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 226 | dependencies: 227 | fast-deep-equal "^3.1.1" 228 | fast-json-stable-stringify "^2.0.0" 229 | json-schema-traverse "^0.4.1" 230 | uri-js "^4.2.2" 231 | 232 | ansi-colors@4.1.1: 233 | version "4.1.1" 234 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 235 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 236 | 237 | ansi-regex@^2.0.0: 238 | version "2.1.1" 239 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 240 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 241 | 242 | ansi-regex@^5.0.0, ansi-regex@^5.0.1: 243 | version "5.0.1" 244 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 245 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 246 | 247 | ansi-styles@^3.2.1: 248 | version "3.2.1" 249 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 250 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 251 | dependencies: 252 | color-convert "^1.9.0" 253 | 254 | ansi-styles@^4.0.0: 255 | version "4.3.0" 256 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 257 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 258 | dependencies: 259 | color-convert "^2.0.1" 260 | 261 | ansi-styles@^4.1.0: 262 | version "4.2.1" 263 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 264 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 265 | dependencies: 266 | "@types/color-name" "^1.1.1" 267 | color-convert "^2.0.1" 268 | 269 | anymatch@~3.1.2: 270 | version "3.1.2" 271 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 272 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 273 | dependencies: 274 | normalize-path "^3.0.0" 275 | picomatch "^2.0.4" 276 | 277 | aproba@^1.0.3: 278 | version "1.2.0" 279 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 280 | integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== 281 | 282 | are-we-there-yet@~1.1.2: 283 | version "1.1.7" 284 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz#b15474a932adab4ff8a50d9adfa7e4e926f21146" 285 | integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g== 286 | dependencies: 287 | delegates "^1.0.0" 288 | readable-stream "^2.0.6" 289 | 290 | argparse@^2.0.1: 291 | version "2.0.1" 292 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 293 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 294 | 295 | array-union@^2.1.0: 296 | version "2.1.0" 297 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 298 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 299 | 300 | await-notify@^1.0.1: 301 | version "1.0.1" 302 | resolved "https://registry.yarnpkg.com/await-notify/-/await-notify-1.0.1.tgz#0b48133b22e524181e11557665185f2a2f3ce47c" 303 | integrity sha1-C0gTOyLlJBgeEVV2ZRhfKi885Hw= 304 | 305 | azure-devops-node-api@^11.0.1: 306 | version "11.0.1" 307 | resolved "https://registry.yarnpkg.com/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz#b7ec4783230e1de8fc972b23effe7ed2ebac17ff" 308 | integrity sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A== 309 | dependencies: 310 | tunnel "0.0.6" 311 | typed-rest-client "^1.8.4" 312 | 313 | balanced-match@^1.0.0: 314 | version "1.0.2" 315 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 316 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 317 | 318 | base64-js@^1.3.1, base64-js@^1.5.1: 319 | version "1.5.1" 320 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 321 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 322 | 323 | binary-extensions@^2.0.0: 324 | version "2.1.0" 325 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" 326 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== 327 | 328 | bl@^4.0.3: 329 | version "4.1.0" 330 | resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" 331 | integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== 332 | dependencies: 333 | buffer "^5.5.0" 334 | inherits "^2.0.4" 335 | readable-stream "^3.4.0" 336 | 337 | boolbase@^1.0.0: 338 | version "1.0.0" 339 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 340 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 341 | 342 | brace-expansion@^1.1.7: 343 | version "1.1.11" 344 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 345 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 346 | dependencies: 347 | balanced-match "^1.0.0" 348 | concat-map "0.0.1" 349 | 350 | braces@^3.0.3, braces@~3.0.2: 351 | version "3.0.3" 352 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 353 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 354 | dependencies: 355 | fill-range "^7.1.1" 356 | 357 | browser-stdout@1.3.1: 358 | version "1.3.1" 359 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 360 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 361 | 362 | buffer-crc32@~0.2.3: 363 | version "0.2.13" 364 | resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" 365 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 366 | 367 | buffer@^5.5.0: 368 | version "5.7.1" 369 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 370 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 371 | dependencies: 372 | base64-js "^1.3.1" 373 | ieee754 "^1.1.13" 374 | 375 | call-bind@^1.0.0: 376 | version "1.0.2" 377 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 378 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 379 | dependencies: 380 | function-bind "^1.1.1" 381 | get-intrinsic "^1.0.2" 382 | 383 | callsites@^3.0.0: 384 | version "3.1.0" 385 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 386 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 387 | 388 | camelcase@^6.0.0: 389 | version "6.2.0" 390 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" 391 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 392 | 393 | chalk@^2.4.2: 394 | version "2.4.2" 395 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 396 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 397 | dependencies: 398 | ansi-styles "^3.2.1" 399 | escape-string-regexp "^1.0.5" 400 | supports-color "^5.3.0" 401 | 402 | chalk@^4.0.0, chalk@^4.1.0: 403 | version "4.1.0" 404 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 405 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 406 | dependencies: 407 | ansi-styles "^4.1.0" 408 | supports-color "^7.1.0" 409 | 410 | cheerio-select@^1.5.0: 411 | version "1.5.0" 412 | resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.5.0.tgz#faf3daeb31b17c5e1a9dabcee288aaf8aafa5823" 413 | integrity sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg== 414 | dependencies: 415 | css-select "^4.1.3" 416 | css-what "^5.0.1" 417 | domelementtype "^2.2.0" 418 | domhandler "^4.2.0" 419 | domutils "^2.7.0" 420 | 421 | cheerio@^1.0.0-rc.9: 422 | version "1.0.0-rc.10" 423 | resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" 424 | integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== 425 | dependencies: 426 | cheerio-select "^1.5.0" 427 | dom-serializer "^1.3.2" 428 | domhandler "^4.2.0" 429 | htmlparser2 "^6.1.0" 430 | parse5 "^6.0.1" 431 | parse5-htmlparser2-tree-adapter "^6.0.1" 432 | tslib "^2.2.0" 433 | 434 | chokidar@3.5.3: 435 | version "3.5.3" 436 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 437 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 438 | dependencies: 439 | anymatch "~3.1.2" 440 | braces "~3.0.2" 441 | glob-parent "~5.1.2" 442 | is-binary-path "~2.1.0" 443 | is-glob "~4.0.1" 444 | normalize-path "~3.0.0" 445 | readdirp "~3.6.0" 446 | optionalDependencies: 447 | fsevents "~2.3.2" 448 | 449 | chownr@^1.1.1: 450 | version "1.1.4" 451 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" 452 | integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== 453 | 454 | cliui@^7.0.2: 455 | version "7.0.4" 456 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 457 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 458 | dependencies: 459 | string-width "^4.2.0" 460 | strip-ansi "^6.0.0" 461 | wrap-ansi "^7.0.0" 462 | 463 | code-point-at@^1.0.0: 464 | version "1.1.0" 465 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 466 | integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 467 | 468 | color-convert@^1.9.0: 469 | version "1.9.3" 470 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 471 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 472 | dependencies: 473 | color-name "1.1.3" 474 | 475 | color-convert@^2.0.1: 476 | version "2.0.1" 477 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 478 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 479 | dependencies: 480 | color-name "~1.1.4" 481 | 482 | color-name@1.1.3: 483 | version "1.1.3" 484 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 485 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 486 | 487 | color-name@~1.1.4: 488 | version "1.1.4" 489 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 490 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 491 | 492 | commander@^6.1.0: 493 | version "6.2.0" 494 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" 495 | integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== 496 | 497 | concat-map@0.0.1: 498 | version "0.0.1" 499 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 500 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 501 | 502 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 503 | version "1.1.0" 504 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 505 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 506 | 507 | core-util-is@~1.0.0: 508 | version "1.0.3" 509 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 510 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 511 | 512 | cross-spawn@^7.0.2: 513 | version "7.0.6" 514 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 515 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 516 | dependencies: 517 | path-key "^3.1.0" 518 | shebang-command "^2.0.0" 519 | which "^2.0.1" 520 | 521 | css-select@^4.1.3: 522 | version "4.1.3" 523 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" 524 | integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== 525 | dependencies: 526 | boolbase "^1.0.0" 527 | css-what "^5.0.0" 528 | domhandler "^4.2.0" 529 | domutils "^2.6.0" 530 | nth-check "^2.0.0" 531 | 532 | css-what@^5.0.0, css-what@^5.0.1: 533 | version "5.0.1" 534 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" 535 | integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== 536 | 537 | debug@4.3.3: 538 | version "4.3.3" 539 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 540 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 541 | dependencies: 542 | ms "2.1.2" 543 | 544 | debug@^4.1.1, debug@^4.3.2: 545 | version "4.3.4" 546 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 547 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 548 | dependencies: 549 | ms "2.1.2" 550 | 551 | decamelize@^4.0.0: 552 | version "4.0.0" 553 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 554 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 555 | 556 | decompress-response@^4.2.0: 557 | version "4.2.1" 558 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 559 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 560 | dependencies: 561 | mimic-response "^2.0.0" 562 | 563 | deep-extend@^0.6.0: 564 | version "0.6.0" 565 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 566 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 567 | 568 | deep-is@^0.1.3: 569 | version "0.1.3" 570 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 571 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 572 | 573 | delegates@^1.0.0: 574 | version "1.0.0" 575 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 576 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 577 | 578 | detect-libc@^1.0.3: 579 | version "1.0.3" 580 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 581 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 582 | 583 | diff@5.0.0: 584 | version "5.0.0" 585 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 586 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 587 | 588 | dir-glob@^3.0.1: 589 | version "3.0.1" 590 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 591 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 592 | dependencies: 593 | path-type "^4.0.0" 594 | 595 | doctrine@^3.0.0: 596 | version "3.0.0" 597 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 598 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 599 | dependencies: 600 | esutils "^2.0.2" 601 | 602 | dom-serializer@^1.0.1, dom-serializer@^1.3.2: 603 | version "1.3.2" 604 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" 605 | integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== 606 | dependencies: 607 | domelementtype "^2.0.1" 608 | domhandler "^4.2.0" 609 | entities "^2.0.0" 610 | 611 | domelementtype@^2.0.1: 612 | version "2.0.1" 613 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" 614 | integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== 615 | 616 | domelementtype@^2.2.0: 617 | version "2.2.0" 618 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 619 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 620 | 621 | domhandler@^4.0.0, domhandler@^4.2.0: 622 | version "4.2.0" 623 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059" 624 | integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA== 625 | dependencies: 626 | domelementtype "^2.2.0" 627 | 628 | domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0: 629 | version "2.7.0" 630 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442" 631 | integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg== 632 | dependencies: 633 | dom-serializer "^1.0.1" 634 | domelementtype "^2.2.0" 635 | domhandler "^4.2.0" 636 | 637 | emoji-regex@^8.0.0: 638 | version "8.0.0" 639 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 640 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 641 | 642 | end-of-stream@^1.1.0, end-of-stream@^1.4.1: 643 | version "1.4.4" 644 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 645 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 646 | dependencies: 647 | once "^1.4.0" 648 | 649 | entities@^2.0.0: 650 | version "2.0.3" 651 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" 652 | integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== 653 | 654 | entities@~2.1.0: 655 | version "2.1.0" 656 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" 657 | integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== 658 | 659 | esbuild-android-64@0.14.29: 660 | version "0.14.29" 661 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.29.tgz#c0960c84c9b832bade20831515e89d32549d4769" 662 | integrity sha512-tJuaN33SVZyiHxRaVTo1pwW+rn3qetJX/SRuc/83rrKYtyZG0XfsQ1ao1nEudIt9w37ZSNXR236xEfm2C43sbw== 663 | 664 | esbuild-android-arm64@0.14.29: 665 | version "0.14.29" 666 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.29.tgz#8eceb3abe5abde5489d6a5cbe6a7c1044f71115f" 667 | integrity sha512-D74dCv6yYnMTlofVy1JKiLM5JdVSQd60/rQfJSDP9qvRAI0laPXIG/IXY1RG6jobmFMUfL38PbFnCqyI/6fPXg== 668 | 669 | esbuild-darwin-64@0.14.29: 670 | version "0.14.29" 671 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.29.tgz#26f3f14102310ecb8f2d9351c5b7a47a60d2cc8a" 672 | integrity sha512-+CJaRvfTkzs9t+CjGa0Oa28WoXa7EeLutQhxus+fFcu0MHhsBhlmeWHac3Cc/Sf/xPi1b2ccDFfzGYJCfV0RrA== 673 | 674 | esbuild-darwin-arm64@0.14.29: 675 | version "0.14.29" 676 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.29.tgz#6d2d89dfd937992649239711ed5b86e51b13bd89" 677 | integrity sha512-5Wgz/+zK+8X2ZW7vIbwoZ613Vfr4A8HmIs1XdzRmdC1kG0n5EG5fvKk/jUxhNlrYPx1gSY7XadQ3l4xAManPSw== 678 | 679 | esbuild-freebsd-64@0.14.29: 680 | version "0.14.29" 681 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.29.tgz#2cb41a0765d0040f0838280a213c81bbe62d6394" 682 | integrity sha512-VTfS7Bm9QA12JK1YXF8+WyYOfvD7WMpbArtDj6bGJ5Sy5xp01c/q70Arkn596aGcGj0TvQRplaaCIrfBG1Wdtg== 683 | 684 | esbuild-freebsd-arm64@0.14.29: 685 | version "0.14.29" 686 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.29.tgz#e1b79fbb63eaeff324cf05519efa7ff12ce4586a" 687 | integrity sha512-WP5L4ejwLWWvd3Fo2J5mlXvG3zQHaw5N1KxFGnUc4+2ZFZknP0ST63i0IQhpJLgEJwnQpXv2uZlU1iWZjFqEIg== 688 | 689 | esbuild-linux-32@0.14.29: 690 | version "0.14.29" 691 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.29.tgz#a4a5a0b165b15081bc3227986e10dd4943edb7d6" 692 | integrity sha512-4myeOvFmQBWdI2U1dEBe2DCSpaZyjdQtmjUY11Zu2eQg4ynqLb8Y5mNjNU9UN063aVsCYYfbs8jbken/PjyidA== 693 | 694 | esbuild-linux-64@0.14.29: 695 | version "0.14.29" 696 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.29.tgz#4c450088c84f8bfd22c51d116f59416864b85481" 697 | integrity sha512-iaEuLhssReAKE7HMwxwFJFn7D/EXEs43fFy5CJeA4DGmU6JHh0qVJD2p/UP46DvUXLRKXsXw0i+kv5TdJ1w5pg== 698 | 699 | esbuild-linux-arm64@0.14.29: 700 | version "0.14.29" 701 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.29.tgz#d1a23993b26cb1f63f740329b2fc09218e498bd1" 702 | integrity sha512-KYf7s8wDfUy+kjKymW3twyGT14OABjGHRkm9gPJ0z4BuvqljfOOUbq9qT3JYFnZJHOgkr29atT//hcdD0Pi7Mw== 703 | 704 | esbuild-linux-arm@0.14.29: 705 | version "0.14.29" 706 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.29.tgz#a7e2fea558525eab812b1fe27d7a2659cd1bb723" 707 | integrity sha512-OXa9D9QL1hwrAnYYAHt/cXAuSCmoSqYfTW/0CEY0LgJNyTxJKtqc5mlwjAZAvgyjmha0auS/sQ0bXfGf2wAokQ== 708 | 709 | esbuild-linux-mips64le@0.14.29: 710 | version "0.14.29" 711 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.29.tgz#e708c527f0785574e400828cdbed3d9b17b5ddff" 712 | integrity sha512-05jPtWQMsZ1aMGfHOvnR5KrTvigPbU35BtuItSSWLI2sJu5VrM8Pr9Owym4wPvA4153DFcOJ1EPN/2ujcDt54g== 713 | 714 | esbuild-linux-ppc64le@0.14.29: 715 | version "0.14.29" 716 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.29.tgz#0137d1b38beae36a57176ef45e90740e734df502" 717 | integrity sha512-FYhBqn4Ir9xG+f6B5VIQVbRuM4S6qwy29dDNYFPoxLRnwTEKToIYIUESN1qHyUmIbfO0YB4phG2JDV2JDN9Kgw== 718 | 719 | esbuild-linux-riscv64@0.14.29: 720 | version "0.14.29" 721 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.29.tgz#a2f73235347a58029dcacf0fb91c9eb8bebc8abb" 722 | integrity sha512-eqZMqPehkb4nZcffnuOpXJQdGURGd6GXQ4ZsDHSWyIUaA+V4FpMBe+5zMPtXRD2N4BtyzVvnBko6K8IWWr36ew== 723 | 724 | esbuild-linux-s390x@0.14.29: 725 | version "0.14.29" 726 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.29.tgz#0f7310ff1daec463ead9b9e26b7aa083a9f9f1ee" 727 | integrity sha512-o7EYajF1rC/4ho7kpSG3gENVx0o2SsHm7cJ5fvewWB/TEczWU7teDgusGSujxCYcMottE3zqa423VTglNTYhjg== 728 | 729 | esbuild-netbsd-64@0.14.29: 730 | version "0.14.29" 731 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.29.tgz#ba9a0d9cb8aed73b684825126927f75d4fe44ff9" 732 | integrity sha512-/esN6tb6OBSot6+JxgeOZeBk6P8V/WdR3GKBFeFpSqhgw4wx7xWUqPrdx4XNpBVO7X4Ipw9SAqgBrWHlXfddww== 733 | 734 | esbuild-openbsd-64@0.14.29: 735 | version "0.14.29" 736 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.29.tgz#36dbe2c32d899106791b5f3af73f359213f71b8a" 737 | integrity sha512-jUTdDzhEKrD0pLpjmk0UxwlfNJNg/D50vdwhrVcW/D26Vg0hVbthMfb19PJMatzclbK7cmgk1Nu0eNS+abzoHw== 738 | 739 | esbuild-sunos-64@0.14.29: 740 | version "0.14.29" 741 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.29.tgz#e5f857c121441ec63bf9b399a2131409a7d344e5" 742 | integrity sha512-EfhQN/XO+TBHTbkxwsxwA7EfiTHFe+MNDfxcf0nj97moCppD9JHPq48MLtOaDcuvrTYOcrMdJVeqmmeQ7doTcg== 743 | 744 | esbuild-windows-32@0.14.29: 745 | version "0.14.29" 746 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.29.tgz#9c2f1ab071a828f3901d1d79d205982a74bdda6e" 747 | integrity sha512-uoyb0YAJ6uWH4PYuYjfGNjvgLlb5t6b3zIaGmpWPOjgpr1Nb3SJtQiK4YCPGhONgfg2v6DcJgSbOteuKXhwqAw== 748 | 749 | esbuild-windows-64@0.14.29: 750 | version "0.14.29" 751 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.29.tgz#85fbce7c2492521896451b98d649a7db93e52667" 752 | integrity sha512-X9cW/Wl95QjsH8WUyr3NqbmfdU72jCp71cH3pwPvI4CgBM2IeOUDdbt6oIGljPu2bf5eGDIo8K3Y3vvXCCTd8A== 753 | 754 | esbuild-windows-arm64@0.14.29: 755 | version "0.14.29" 756 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.29.tgz#0aa7a9a1bc43a63350bcf574d94b639176f065b5" 757 | integrity sha512-+O/PI+68fbUZPpl3eXhqGHTGK7DjLcexNnyJqtLZXOFwoAjaXlS5UBCvVcR3o2va+AqZTj8o6URaz8D2K+yfQQ== 758 | 759 | esbuild@^0.14.29: 760 | version "0.14.29" 761 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.29.tgz#24ad09c0674cbcb4aa2fe761485524eb1f6b1419" 762 | integrity sha512-SQS8cO8xFEqevYlrHt6exIhK853Me4nZ4aMW6ieysInLa0FMAL+AKs87HYNRtR2YWRcEIqoXAHh+Ytt5/66qpg== 763 | optionalDependencies: 764 | esbuild-android-64 "0.14.29" 765 | esbuild-android-arm64 "0.14.29" 766 | esbuild-darwin-64 "0.14.29" 767 | esbuild-darwin-arm64 "0.14.29" 768 | esbuild-freebsd-64 "0.14.29" 769 | esbuild-freebsd-arm64 "0.14.29" 770 | esbuild-linux-32 "0.14.29" 771 | esbuild-linux-64 "0.14.29" 772 | esbuild-linux-arm "0.14.29" 773 | esbuild-linux-arm64 "0.14.29" 774 | esbuild-linux-mips64le "0.14.29" 775 | esbuild-linux-ppc64le "0.14.29" 776 | esbuild-linux-riscv64 "0.14.29" 777 | esbuild-linux-s390x "0.14.29" 778 | esbuild-netbsd-64 "0.14.29" 779 | esbuild-openbsd-64 "0.14.29" 780 | esbuild-sunos-64 "0.14.29" 781 | esbuild-windows-32 "0.14.29" 782 | esbuild-windows-64 "0.14.29" 783 | esbuild-windows-arm64 "0.14.29" 784 | 785 | escalade@^3.1.1: 786 | version "3.1.1" 787 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 788 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 789 | 790 | escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: 791 | version "4.0.0" 792 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 793 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 794 | 795 | escape-string-regexp@^1.0.5: 796 | version "1.0.5" 797 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 798 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 799 | 800 | eslint-scope@^5.1.1: 801 | version "5.1.1" 802 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 803 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 804 | dependencies: 805 | esrecurse "^4.3.0" 806 | estraverse "^4.1.1" 807 | 808 | eslint-scope@^7.1.1: 809 | version "7.1.1" 810 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" 811 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 812 | dependencies: 813 | esrecurse "^4.3.0" 814 | estraverse "^5.2.0" 815 | 816 | eslint-utils@^3.0.0: 817 | version "3.0.0" 818 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" 819 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 820 | dependencies: 821 | eslint-visitor-keys "^2.0.0" 822 | 823 | eslint-visitor-keys@^2.0.0: 824 | version "2.0.0" 825 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" 826 | integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== 827 | 828 | eslint-visitor-keys@^3.0.0: 829 | version "3.0.0" 830 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz#e32e99c6cdc2eb063f204eda5db67bfe58bb4186" 831 | integrity sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q== 832 | 833 | eslint-visitor-keys@^3.3.0: 834 | version "3.3.0" 835 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" 836 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 837 | 838 | eslint@^8.12.0: 839 | version "8.12.0" 840 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.12.0.tgz#c7a5bd1cfa09079aae64c9076c07eada66a46e8e" 841 | integrity sha512-it1oBL9alZg1S8UycLm5YDMAkIhtH6FtAzuZs6YvoGVldWjbS08BkAdb/ymP9LlAyq8koANu32U7Ib/w+UNh8Q== 842 | dependencies: 843 | "@eslint/eslintrc" "^1.2.1" 844 | "@humanwhocodes/config-array" "^0.9.2" 845 | ajv "^6.10.0" 846 | chalk "^4.0.0" 847 | cross-spawn "^7.0.2" 848 | debug "^4.3.2" 849 | doctrine "^3.0.0" 850 | escape-string-regexp "^4.0.0" 851 | eslint-scope "^7.1.1" 852 | eslint-utils "^3.0.0" 853 | eslint-visitor-keys "^3.3.0" 854 | espree "^9.3.1" 855 | esquery "^1.4.0" 856 | esutils "^2.0.2" 857 | fast-deep-equal "^3.1.3" 858 | file-entry-cache "^6.0.1" 859 | functional-red-black-tree "^1.0.1" 860 | glob-parent "^6.0.1" 861 | globals "^13.6.0" 862 | ignore "^5.2.0" 863 | import-fresh "^3.0.0" 864 | imurmurhash "^0.1.4" 865 | is-glob "^4.0.0" 866 | js-yaml "^4.1.0" 867 | json-stable-stringify-without-jsonify "^1.0.1" 868 | levn "^0.4.1" 869 | lodash.merge "^4.6.2" 870 | minimatch "^3.0.4" 871 | natural-compare "^1.4.0" 872 | optionator "^0.9.1" 873 | regexpp "^3.2.0" 874 | strip-ansi "^6.0.1" 875 | strip-json-comments "^3.1.0" 876 | text-table "^0.2.0" 877 | v8-compile-cache "^2.0.3" 878 | 879 | espree@^9.3.1: 880 | version "9.3.1" 881 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd" 882 | integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ== 883 | dependencies: 884 | acorn "^8.7.0" 885 | acorn-jsx "^5.3.1" 886 | eslint-visitor-keys "^3.3.0" 887 | 888 | esquery@^1.4.0: 889 | version "1.4.0" 890 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" 891 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 892 | dependencies: 893 | estraverse "^5.1.0" 894 | 895 | esrecurse@^4.3.0: 896 | version "4.3.0" 897 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 898 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 899 | dependencies: 900 | estraverse "^5.2.0" 901 | 902 | estraverse@^4.1.1: 903 | version "4.3.0" 904 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 905 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 906 | 907 | estraverse@^5.1.0, estraverse@^5.2.0: 908 | version "5.2.0" 909 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" 910 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 911 | 912 | esutils@^2.0.2: 913 | version "2.0.3" 914 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 915 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 916 | 917 | events@^3.3.0: 918 | version "3.3.0" 919 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 920 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 921 | 922 | expand-template@^2.0.3: 923 | version "2.0.3" 924 | resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" 925 | integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== 926 | 927 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 928 | version "3.1.3" 929 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 930 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 931 | 932 | fast-glob@^3.1.1: 933 | version "3.2.5" 934 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" 935 | integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== 936 | dependencies: 937 | "@nodelib/fs.stat" "^2.0.2" 938 | "@nodelib/fs.walk" "^1.2.3" 939 | glob-parent "^5.1.0" 940 | merge2 "^1.3.0" 941 | micromatch "^4.0.2" 942 | picomatch "^2.2.1" 943 | 944 | fast-json-stable-stringify@^2.0.0: 945 | version "2.1.0" 946 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 947 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 948 | 949 | fast-levenshtein@^2.0.6: 950 | version "2.0.6" 951 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 952 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 953 | 954 | fastq@^1.6.0: 955 | version "1.11.0" 956 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" 957 | integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== 958 | dependencies: 959 | reusify "^1.0.4" 960 | 961 | fd-slicer@~1.1.0: 962 | version "1.1.0" 963 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" 964 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 965 | dependencies: 966 | pend "~1.2.0" 967 | 968 | file-entry-cache@^6.0.1: 969 | version "6.0.1" 970 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 971 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 972 | dependencies: 973 | flat-cache "^3.0.4" 974 | 975 | fill-range@^7.1.1: 976 | version "7.1.1" 977 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 978 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 979 | dependencies: 980 | to-regex-range "^5.0.1" 981 | 982 | find-up@5.0.0: 983 | version "5.0.0" 984 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 985 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 986 | dependencies: 987 | locate-path "^6.0.0" 988 | path-exists "^4.0.0" 989 | 990 | flat-cache@^3.0.4: 991 | version "3.0.4" 992 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" 993 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 994 | dependencies: 995 | flatted "^3.1.0" 996 | rimraf "^3.0.2" 997 | 998 | flat@^5.0.2: 999 | version "5.0.2" 1000 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 1001 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 1002 | 1003 | flatted@^3.1.0: 1004 | version "3.1.1" 1005 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" 1006 | integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== 1007 | 1008 | fs-constants@^1.0.0: 1009 | version "1.0.0" 1010 | resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" 1011 | integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== 1012 | 1013 | fs.realpath@^1.0.0: 1014 | version "1.0.0" 1015 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1016 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1017 | 1018 | fsevents@~2.3.2: 1019 | version "2.3.2" 1020 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 1021 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1022 | 1023 | function-bind@^1.1.1: 1024 | version "1.1.1" 1025 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 1026 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1027 | 1028 | functional-red-black-tree@^1.0.1: 1029 | version "1.0.1" 1030 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 1031 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 1032 | 1033 | gauge@~2.7.3: 1034 | version "2.7.4" 1035 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1036 | integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= 1037 | dependencies: 1038 | aproba "^1.0.3" 1039 | console-control-strings "^1.0.0" 1040 | has-unicode "^2.0.0" 1041 | object-assign "^4.1.0" 1042 | signal-exit "^3.0.0" 1043 | string-width "^1.0.1" 1044 | strip-ansi "^3.0.1" 1045 | wide-align "^1.1.0" 1046 | 1047 | get-caller-file@^2.0.5: 1048 | version "2.0.5" 1049 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1050 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1051 | 1052 | get-intrinsic@^1.0.2: 1053 | version "1.1.3" 1054 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" 1055 | integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== 1056 | dependencies: 1057 | function-bind "^1.1.1" 1058 | has "^1.0.3" 1059 | has-symbols "^1.0.3" 1060 | 1061 | github-from-package@0.0.0: 1062 | version "0.0.0" 1063 | resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" 1064 | integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= 1065 | 1066 | glob-parent@^5.1.0, glob-parent@~5.1.2: 1067 | version "5.1.2" 1068 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1069 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1070 | dependencies: 1071 | is-glob "^4.0.1" 1072 | 1073 | glob-parent@^6.0.1: 1074 | version "6.0.2" 1075 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1076 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1077 | dependencies: 1078 | is-glob "^4.0.3" 1079 | 1080 | glob@7.2.0, glob@^7.2.0: 1081 | version "7.2.0" 1082 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 1083 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 1084 | dependencies: 1085 | fs.realpath "^1.0.0" 1086 | inflight "^1.0.4" 1087 | inherits "2" 1088 | minimatch "^3.0.4" 1089 | once "^1.3.0" 1090 | path-is-absolute "^1.0.0" 1091 | 1092 | glob@^7.0.6, glob@^7.1.3: 1093 | version "7.1.6" 1094 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 1095 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1096 | dependencies: 1097 | fs.realpath "^1.0.0" 1098 | inflight "^1.0.4" 1099 | inherits "2" 1100 | minimatch "^3.0.4" 1101 | once "^1.3.0" 1102 | path-is-absolute "^1.0.0" 1103 | 1104 | globals@^13.6.0: 1105 | version "13.7.0" 1106 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.7.0.tgz#aed3bcefd80ad3ec0f0be2cf0c895110c0591795" 1107 | integrity sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA== 1108 | dependencies: 1109 | type-fest "^0.20.2" 1110 | 1111 | globals@^13.9.0: 1112 | version "13.11.0" 1113 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" 1114 | integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== 1115 | dependencies: 1116 | type-fest "^0.20.2" 1117 | 1118 | globby@^11.0.4: 1119 | version "11.0.4" 1120 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" 1121 | integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== 1122 | dependencies: 1123 | array-union "^2.1.0" 1124 | dir-glob "^3.0.1" 1125 | fast-glob "^3.1.1" 1126 | ignore "^5.1.4" 1127 | merge2 "^1.3.0" 1128 | slash "^3.0.0" 1129 | 1130 | growl@1.10.5: 1131 | version "1.10.5" 1132 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 1133 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 1134 | 1135 | has-flag@^3.0.0: 1136 | version "3.0.0" 1137 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 1138 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1139 | 1140 | has-flag@^4.0.0: 1141 | version "4.0.0" 1142 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1143 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1144 | 1145 | has-symbols@^1.0.3: 1146 | version "1.0.3" 1147 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1148 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1149 | 1150 | has-unicode@^2.0.0: 1151 | version "2.0.1" 1152 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1153 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 1154 | 1155 | has@^1.0.3: 1156 | version "1.0.3" 1157 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 1158 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1159 | dependencies: 1160 | function-bind "^1.1.1" 1161 | 1162 | he@1.2.0: 1163 | version "1.2.0" 1164 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 1165 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 1166 | 1167 | hosted-git-info@^4.0.2: 1168 | version "4.0.2" 1169 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" 1170 | integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== 1171 | dependencies: 1172 | lru-cache "^6.0.0" 1173 | 1174 | htmlparser2@^6.1.0: 1175 | version "6.1.0" 1176 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" 1177 | integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== 1178 | dependencies: 1179 | domelementtype "^2.0.1" 1180 | domhandler "^4.0.0" 1181 | domutils "^2.5.2" 1182 | entities "^2.0.0" 1183 | 1184 | ieee754@^1.1.13: 1185 | version "1.2.1" 1186 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1187 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1188 | 1189 | ignore@^5.1.4, ignore@^5.1.8: 1190 | version "5.1.8" 1191 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" 1192 | integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== 1193 | 1194 | ignore@^5.2.0: 1195 | version "5.2.0" 1196 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" 1197 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1198 | 1199 | import-fresh@^3.0.0: 1200 | version "3.2.1" 1201 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" 1202 | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 1203 | dependencies: 1204 | parent-module "^1.0.0" 1205 | resolve-from "^4.0.0" 1206 | 1207 | import-fresh@^3.2.1: 1208 | version "3.3.0" 1209 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1210 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1211 | dependencies: 1212 | parent-module "^1.0.0" 1213 | resolve-from "^4.0.0" 1214 | 1215 | imurmurhash@^0.1.4: 1216 | version "0.1.4" 1217 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1218 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 1219 | 1220 | inflight@^1.0.4: 1221 | version "1.0.6" 1222 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1223 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1224 | dependencies: 1225 | once "^1.3.0" 1226 | wrappy "1" 1227 | 1228 | inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: 1229 | version "2.0.4" 1230 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1231 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1232 | 1233 | ini@~1.3.0: 1234 | version "1.3.8" 1235 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 1236 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 1237 | 1238 | is-binary-path@~2.1.0: 1239 | version "2.1.0" 1240 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1241 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1242 | dependencies: 1243 | binary-extensions "^2.0.0" 1244 | 1245 | is-extglob@^2.1.1: 1246 | version "2.1.1" 1247 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1248 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1249 | 1250 | is-fullwidth-code-point@^1.0.0: 1251 | version "1.0.0" 1252 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1253 | integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= 1254 | dependencies: 1255 | number-is-nan "^1.0.0" 1256 | 1257 | is-fullwidth-code-point@^3.0.0: 1258 | version "3.0.0" 1259 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1260 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1261 | 1262 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 1263 | version "4.0.1" 1264 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 1265 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1266 | dependencies: 1267 | is-extglob "^2.1.1" 1268 | 1269 | is-glob@^4.0.3: 1270 | version "4.0.3" 1271 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1272 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1273 | dependencies: 1274 | is-extglob "^2.1.1" 1275 | 1276 | is-number@^7.0.0: 1277 | version "7.0.0" 1278 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1279 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1280 | 1281 | is-plain-obj@^2.1.0: 1282 | version "2.1.0" 1283 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1284 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1285 | 1286 | is-unicode-supported@^0.1.0: 1287 | version "0.1.0" 1288 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1289 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1290 | 1291 | isarray@~1.0.0: 1292 | version "1.0.0" 1293 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1294 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1295 | 1296 | isexe@^2.0.0: 1297 | version "2.0.0" 1298 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1299 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1300 | 1301 | js-yaml@4.1.0, js-yaml@^4.1.0: 1302 | version "4.1.0" 1303 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1304 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1305 | dependencies: 1306 | argparse "^2.0.1" 1307 | 1308 | json-schema-traverse@^0.4.1: 1309 | version "0.4.1" 1310 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1311 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1312 | 1313 | json-stable-stringify-without-jsonify@^1.0.1: 1314 | version "1.0.1" 1315 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1316 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1317 | 1318 | keytar@^7.7.0: 1319 | version "7.7.0" 1320 | resolved "https://registry.yarnpkg.com/keytar/-/keytar-7.7.0.tgz#3002b106c01631aa79b1aa9ee0493b94179bbbd2" 1321 | integrity sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A== 1322 | dependencies: 1323 | node-addon-api "^3.0.0" 1324 | prebuild-install "^6.0.0" 1325 | 1326 | leven@^3.1.0: 1327 | version "3.1.0" 1328 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 1329 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 1330 | 1331 | levn@^0.4.1: 1332 | version "0.4.1" 1333 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1334 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1335 | dependencies: 1336 | prelude-ls "^1.2.1" 1337 | type-check "~0.4.0" 1338 | 1339 | linkify-it@^3.0.1: 1340 | version "3.0.3" 1341 | resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" 1342 | integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== 1343 | dependencies: 1344 | uc.micro "^1.0.1" 1345 | 1346 | locate-path@^6.0.0: 1347 | version "6.0.0" 1348 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1349 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1350 | dependencies: 1351 | p-locate "^5.0.0" 1352 | 1353 | lodash.merge@^4.6.2: 1354 | version "4.6.2" 1355 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1356 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1357 | 1358 | log-symbols@4.1.0: 1359 | version "4.1.0" 1360 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1361 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1362 | dependencies: 1363 | chalk "^4.1.0" 1364 | is-unicode-supported "^0.1.0" 1365 | 1366 | lru-cache@^6.0.0: 1367 | version "6.0.0" 1368 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 1369 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 1370 | dependencies: 1371 | yallist "^4.0.0" 1372 | 1373 | markdown-it@^12.3.2: 1374 | version "12.3.2" 1375 | resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.3.2.tgz#bf92ac92283fe983fe4de8ff8abfb5ad72cd0c90" 1376 | integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== 1377 | dependencies: 1378 | argparse "^2.0.1" 1379 | entities "~2.1.0" 1380 | linkify-it "^3.0.1" 1381 | mdurl "^1.0.1" 1382 | uc.micro "^1.0.5" 1383 | 1384 | mdurl@^1.0.1: 1385 | version "1.0.1" 1386 | resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" 1387 | integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= 1388 | 1389 | merge2@^1.3.0: 1390 | version "1.4.1" 1391 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1392 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1393 | 1394 | micromatch@^4.0.2: 1395 | version "4.0.8" 1396 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1397 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1398 | dependencies: 1399 | braces "^3.0.3" 1400 | picomatch "^2.3.1" 1401 | 1402 | mime@^1.3.4: 1403 | version "1.6.0" 1404 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1405 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1406 | 1407 | mimic-response@^2.0.0: 1408 | version "2.1.0" 1409 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 1410 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 1411 | 1412 | minimatch@4.2.1: 1413 | version "4.2.1" 1414 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" 1415 | integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== 1416 | dependencies: 1417 | brace-expansion "^1.1.7" 1418 | 1419 | minimatch@^3.0.3, minimatch@^3.0.4: 1420 | version "3.1.2" 1421 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1422 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1423 | dependencies: 1424 | brace-expansion "^1.1.7" 1425 | 1426 | minimist@^1.2.0, minimist@^1.2.3: 1427 | version "1.2.6" 1428 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 1429 | integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== 1430 | 1431 | mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: 1432 | version "0.5.3" 1433 | resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" 1434 | integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== 1435 | 1436 | mocha@^9.2.2: 1437 | version "9.2.2" 1438 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" 1439 | integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== 1440 | dependencies: 1441 | "@ungap/promise-all-settled" "1.1.2" 1442 | ansi-colors "4.1.1" 1443 | browser-stdout "1.3.1" 1444 | chokidar "3.5.3" 1445 | debug "4.3.3" 1446 | diff "5.0.0" 1447 | escape-string-regexp "4.0.0" 1448 | find-up "5.0.0" 1449 | glob "7.2.0" 1450 | growl "1.10.5" 1451 | he "1.2.0" 1452 | js-yaml "4.1.0" 1453 | log-symbols "4.1.0" 1454 | minimatch "4.2.1" 1455 | ms "2.1.3" 1456 | nanoid "3.3.1" 1457 | serialize-javascript "6.0.0" 1458 | strip-json-comments "3.1.1" 1459 | supports-color "8.1.1" 1460 | which "2.0.2" 1461 | workerpool "6.2.0" 1462 | yargs "16.2.0" 1463 | yargs-parser "20.2.4" 1464 | yargs-unparser "2.0.0" 1465 | 1466 | ms@2.1.2: 1467 | version "2.1.2" 1468 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1469 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1470 | 1471 | ms@2.1.3: 1472 | version "2.1.3" 1473 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1474 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1475 | 1476 | mute-stream@~0.0.4: 1477 | version "0.0.8" 1478 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 1479 | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1480 | 1481 | nanoid@3.3.1: 1482 | version "3.3.1" 1483 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" 1484 | integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== 1485 | 1486 | napi-build-utils@^1.0.1: 1487 | version "1.0.2" 1488 | resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" 1489 | integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== 1490 | 1491 | natural-compare@^1.4.0: 1492 | version "1.4.0" 1493 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1494 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1495 | 1496 | node-abi@^2.21.0: 1497 | version "2.30.1" 1498 | resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.1.tgz#c437d4b1fe0e285aaf290d45b45d4d7afedac4cf" 1499 | integrity sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w== 1500 | dependencies: 1501 | semver "^5.4.1" 1502 | 1503 | node-addon-api@^3.0.0: 1504 | version "3.2.1" 1505 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" 1506 | integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== 1507 | 1508 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1509 | version "3.0.0" 1510 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1511 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1512 | 1513 | npmlog@^4.0.1: 1514 | version "4.1.2" 1515 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1516 | integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== 1517 | dependencies: 1518 | are-we-there-yet "~1.1.2" 1519 | console-control-strings "~1.1.0" 1520 | gauge "~2.7.3" 1521 | set-blocking "~2.0.0" 1522 | 1523 | nth-check@^2.0.0: 1524 | version "2.0.1" 1525 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" 1526 | integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== 1527 | dependencies: 1528 | boolbase "^1.0.0" 1529 | 1530 | number-is-nan@^1.0.0: 1531 | version "1.0.1" 1532 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1533 | integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= 1534 | 1535 | object-assign@^4.1.0: 1536 | version "4.1.1" 1537 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1538 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1539 | 1540 | object-inspect@^1.9.0: 1541 | version "1.12.2" 1542 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" 1543 | integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== 1544 | 1545 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1546 | version "1.4.0" 1547 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1548 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1549 | dependencies: 1550 | wrappy "1" 1551 | 1552 | optionator@^0.9.1: 1553 | version "0.9.1" 1554 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" 1555 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1556 | dependencies: 1557 | deep-is "^0.1.3" 1558 | fast-levenshtein "^2.0.6" 1559 | levn "^0.4.1" 1560 | prelude-ls "^1.2.1" 1561 | type-check "^0.4.0" 1562 | word-wrap "^1.2.3" 1563 | 1564 | p-limit@^3.0.2: 1565 | version "3.1.0" 1566 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1567 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1568 | dependencies: 1569 | yocto-queue "^0.1.0" 1570 | 1571 | p-locate@^5.0.0: 1572 | version "5.0.0" 1573 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1574 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1575 | dependencies: 1576 | p-limit "^3.0.2" 1577 | 1578 | parent-module@^1.0.0: 1579 | version "1.0.1" 1580 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1581 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1582 | dependencies: 1583 | callsites "^3.0.0" 1584 | 1585 | parse-semver@^1.1.1: 1586 | version "1.1.1" 1587 | resolved "https://registry.yarnpkg.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8" 1588 | integrity sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg= 1589 | dependencies: 1590 | semver "^5.1.0" 1591 | 1592 | parse5-htmlparser2-tree-adapter@^6.0.1: 1593 | version "6.0.1" 1594 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" 1595 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 1596 | dependencies: 1597 | parse5 "^6.0.1" 1598 | 1599 | parse5@^6.0.1: 1600 | version "6.0.1" 1601 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 1602 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 1603 | 1604 | path-browserify@^1.0.1: 1605 | version "1.0.1" 1606 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" 1607 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 1608 | 1609 | path-exists@^4.0.0: 1610 | version "4.0.0" 1611 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1612 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1613 | 1614 | path-is-absolute@^1.0.0: 1615 | version "1.0.1" 1616 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1617 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1618 | 1619 | path-key@^3.1.0: 1620 | version "3.1.1" 1621 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1622 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1623 | 1624 | path-type@^4.0.0: 1625 | version "4.0.0" 1626 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1627 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1628 | 1629 | pend@~1.2.0: 1630 | version "1.2.0" 1631 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 1632 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 1633 | 1634 | picomatch@^2.0.4, picomatch@^2.2.1: 1635 | version "2.2.2" 1636 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1637 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1638 | 1639 | picomatch@^2.3.1: 1640 | version "2.3.1" 1641 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1642 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1643 | 1644 | prebuild-install@^6.0.0: 1645 | version "6.1.4" 1646 | resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.4.tgz#ae3c0142ad611d58570b89af4986088a4937e00f" 1647 | integrity sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ== 1648 | dependencies: 1649 | detect-libc "^1.0.3" 1650 | expand-template "^2.0.3" 1651 | github-from-package "0.0.0" 1652 | minimist "^1.2.3" 1653 | mkdirp-classic "^0.5.3" 1654 | napi-build-utils "^1.0.1" 1655 | node-abi "^2.21.0" 1656 | npmlog "^4.0.1" 1657 | pump "^3.0.0" 1658 | rc "^1.2.7" 1659 | simple-get "^3.0.3" 1660 | tar-fs "^2.0.0" 1661 | tunnel-agent "^0.6.0" 1662 | 1663 | prelude-ls@^1.2.1: 1664 | version "1.2.1" 1665 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1666 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1667 | 1668 | process-nextick-args@~2.0.0: 1669 | version "2.0.1" 1670 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1671 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1672 | 1673 | pump@^3.0.0: 1674 | version "3.0.0" 1675 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1676 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1677 | dependencies: 1678 | end-of-stream "^1.1.0" 1679 | once "^1.3.1" 1680 | 1681 | punycode@1.3.2: 1682 | version "1.3.2" 1683 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" 1684 | integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= 1685 | 1686 | punycode@^2.1.0: 1687 | version "2.1.1" 1688 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1689 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1690 | 1691 | qs@^6.9.1: 1692 | version "6.11.0" 1693 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1694 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1695 | dependencies: 1696 | side-channel "^1.0.4" 1697 | 1698 | querystring@0.2.0: 1699 | version "0.2.0" 1700 | resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" 1701 | integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= 1702 | 1703 | queue-microtask@^1.2.2: 1704 | version "1.2.3" 1705 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1706 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1707 | 1708 | randombytes@^2.1.0: 1709 | version "2.1.0" 1710 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1711 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1712 | dependencies: 1713 | safe-buffer "^5.1.0" 1714 | 1715 | rc@^1.2.7: 1716 | version "1.2.8" 1717 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1718 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1719 | dependencies: 1720 | deep-extend "^0.6.0" 1721 | ini "~1.3.0" 1722 | minimist "^1.2.0" 1723 | strip-json-comments "~2.0.1" 1724 | 1725 | read@^1.0.7: 1726 | version "1.0.7" 1727 | resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" 1728 | integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= 1729 | dependencies: 1730 | mute-stream "~0.0.4" 1731 | 1732 | readable-stream@^2.0.6: 1733 | version "2.3.7" 1734 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1735 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1736 | dependencies: 1737 | core-util-is "~1.0.0" 1738 | inherits "~2.0.3" 1739 | isarray "~1.0.0" 1740 | process-nextick-args "~2.0.0" 1741 | safe-buffer "~5.1.1" 1742 | string_decoder "~1.1.1" 1743 | util-deprecate "~1.0.1" 1744 | 1745 | readable-stream@^3.1.1, readable-stream@^3.4.0: 1746 | version "3.6.0" 1747 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1748 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1749 | dependencies: 1750 | inherits "^2.0.3" 1751 | string_decoder "^1.1.1" 1752 | util-deprecate "^1.0.1" 1753 | 1754 | readdirp@~3.6.0: 1755 | version "3.6.0" 1756 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1757 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1758 | dependencies: 1759 | picomatch "^2.2.1" 1760 | 1761 | regexpp@^3.2.0: 1762 | version "3.2.0" 1763 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" 1764 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 1765 | 1766 | require-directory@^2.1.1: 1767 | version "2.1.1" 1768 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1769 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1770 | 1771 | resolve-from@^4.0.0: 1772 | version "4.0.0" 1773 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1774 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1775 | 1776 | reusify@^1.0.4: 1777 | version "1.0.4" 1778 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1779 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1780 | 1781 | rimraf@^3.0.0, rimraf@^3.0.2: 1782 | version "3.0.2" 1783 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1784 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1785 | dependencies: 1786 | glob "^7.1.3" 1787 | 1788 | run-parallel@^1.1.9: 1789 | version "1.2.0" 1790 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1791 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1792 | dependencies: 1793 | queue-microtask "^1.2.2" 1794 | 1795 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: 1796 | version "5.2.1" 1797 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1798 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1799 | 1800 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1801 | version "5.1.2" 1802 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1803 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1804 | 1805 | sax@>=0.6.0: 1806 | version "1.2.4" 1807 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 1808 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1809 | 1810 | semver@^5.1.0, semver@^5.4.1: 1811 | version "5.7.2" 1812 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" 1813 | integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== 1814 | 1815 | semver@^7.3.5: 1816 | version "7.5.4" 1817 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 1818 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 1819 | dependencies: 1820 | lru-cache "^6.0.0" 1821 | 1822 | serialize-javascript@6.0.0: 1823 | version "6.0.0" 1824 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1825 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1826 | dependencies: 1827 | randombytes "^2.1.0" 1828 | 1829 | set-blocking@~2.0.0: 1830 | version "2.0.0" 1831 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1832 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1833 | 1834 | shebang-command@^2.0.0: 1835 | version "2.0.0" 1836 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1837 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1838 | dependencies: 1839 | shebang-regex "^3.0.0" 1840 | 1841 | shebang-regex@^3.0.0: 1842 | version "3.0.0" 1843 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1844 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1845 | 1846 | side-channel@^1.0.4: 1847 | version "1.0.4" 1848 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1849 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1850 | dependencies: 1851 | call-bind "^1.0.0" 1852 | get-intrinsic "^1.0.2" 1853 | object-inspect "^1.9.0" 1854 | 1855 | signal-exit@^3.0.0: 1856 | version "3.0.6" 1857 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 1858 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 1859 | 1860 | simple-concat@^1.0.0: 1861 | version "1.0.1" 1862 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 1863 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 1864 | 1865 | simple-get@^3.0.3: 1866 | version "3.1.1" 1867 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55" 1868 | integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== 1869 | dependencies: 1870 | decompress-response "^4.2.0" 1871 | once "^1.3.1" 1872 | simple-concat "^1.0.0" 1873 | 1874 | slash@^3.0.0: 1875 | version "3.0.0" 1876 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1877 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1878 | 1879 | string-width@^1.0.1: 1880 | version "1.0.2" 1881 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1882 | integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= 1883 | dependencies: 1884 | code-point-at "^1.0.0" 1885 | is-fullwidth-code-point "^1.0.0" 1886 | strip-ansi "^3.0.0" 1887 | 1888 | "string-width@^1.0.2 || 2 || 3 || 4": 1889 | version "4.2.3" 1890 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1891 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1892 | dependencies: 1893 | emoji-regex "^8.0.0" 1894 | is-fullwidth-code-point "^3.0.0" 1895 | strip-ansi "^6.0.1" 1896 | 1897 | string-width@^4.1.0, string-width@^4.2.0: 1898 | version "4.2.2" 1899 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1900 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1901 | dependencies: 1902 | emoji-regex "^8.0.0" 1903 | is-fullwidth-code-point "^3.0.0" 1904 | strip-ansi "^6.0.0" 1905 | 1906 | string_decoder@^1.1.1: 1907 | version "1.3.0" 1908 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1909 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1910 | dependencies: 1911 | safe-buffer "~5.2.0" 1912 | 1913 | string_decoder@~1.1.1: 1914 | version "1.1.1" 1915 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1916 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1917 | dependencies: 1918 | safe-buffer "~5.1.0" 1919 | 1920 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1921 | version "3.0.1" 1922 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1923 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1924 | dependencies: 1925 | ansi-regex "^2.0.0" 1926 | 1927 | strip-ansi@^6.0.0: 1928 | version "6.0.0" 1929 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1930 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1931 | dependencies: 1932 | ansi-regex "^5.0.0" 1933 | 1934 | strip-ansi@^6.0.1: 1935 | version "6.0.1" 1936 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1937 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1938 | dependencies: 1939 | ansi-regex "^5.0.1" 1940 | 1941 | strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 1942 | version "3.1.1" 1943 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1944 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1945 | 1946 | strip-json-comments@~2.0.1: 1947 | version "2.0.1" 1948 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1949 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1950 | 1951 | supports-color@8.1.1: 1952 | version "8.1.1" 1953 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1954 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1955 | dependencies: 1956 | has-flag "^4.0.0" 1957 | 1958 | supports-color@^5.3.0: 1959 | version "5.5.0" 1960 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1961 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1962 | dependencies: 1963 | has-flag "^3.0.0" 1964 | 1965 | supports-color@^7.1.0: 1966 | version "7.1.0" 1967 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1968 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1969 | dependencies: 1970 | has-flag "^4.0.0" 1971 | 1972 | tar-fs@^2.0.0: 1973 | version "2.1.2" 1974 | resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" 1975 | integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== 1976 | dependencies: 1977 | chownr "^1.1.1" 1978 | mkdirp-classic "^0.5.2" 1979 | pump "^3.0.0" 1980 | tar-stream "^2.1.4" 1981 | 1982 | tar-stream@^2.1.4: 1983 | version "2.2.0" 1984 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" 1985 | integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== 1986 | dependencies: 1987 | bl "^4.0.3" 1988 | end-of-stream "^1.4.1" 1989 | fs-constants "^1.0.0" 1990 | inherits "^2.0.3" 1991 | readable-stream "^3.1.1" 1992 | 1993 | text-table@^0.2.0: 1994 | version "0.2.0" 1995 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1996 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1997 | 1998 | tmp@^0.2.1: 1999 | version "0.2.1" 2000 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" 2001 | integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== 2002 | dependencies: 2003 | rimraf "^3.0.0" 2004 | 2005 | to-regex-range@^5.0.1: 2006 | version "5.0.1" 2007 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2008 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2009 | dependencies: 2010 | is-number "^7.0.0" 2011 | 2012 | tslib@^1.8.1: 2013 | version "1.13.0" 2014 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 2015 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 2016 | 2017 | tslib@^2.2.0: 2018 | version "2.3.0" 2019 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" 2020 | integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== 2021 | 2022 | tsutils@^3.21.0: 2023 | version "3.21.0" 2024 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" 2025 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 2026 | dependencies: 2027 | tslib "^1.8.1" 2028 | 2029 | tunnel-agent@^0.6.0: 2030 | version "0.6.0" 2031 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2032 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 2033 | dependencies: 2034 | safe-buffer "^5.0.1" 2035 | 2036 | tunnel@0.0.6: 2037 | version "0.0.6" 2038 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" 2039 | integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== 2040 | 2041 | type-check@^0.4.0, type-check@~0.4.0: 2042 | version "0.4.0" 2043 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2044 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2045 | dependencies: 2046 | prelude-ls "^1.2.1" 2047 | 2048 | type-fest@^0.20.2: 2049 | version "0.20.2" 2050 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 2051 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 2052 | 2053 | typed-rest-client@^1.8.4: 2054 | version "1.8.4" 2055 | resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-1.8.4.tgz#ba3fb788e5b9322547406392533f12d660a5ced6" 2056 | integrity sha512-MyfKKYzk3I6/QQp6e1T50py4qg+c+9BzOEl2rBmQIpStwNUoqQ73An+Tkfy9YuV7O+o2mpVVJpe+fH//POZkbg== 2057 | dependencies: 2058 | qs "^6.9.1" 2059 | tunnel "0.0.6" 2060 | underscore "^1.12.1" 2061 | 2062 | typescript@^4.6.3: 2063 | version "4.6.3" 2064 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" 2065 | integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== 2066 | 2067 | uc.micro@^1.0.1, uc.micro@^1.0.5: 2068 | version "1.0.6" 2069 | resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" 2070 | integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== 2071 | 2072 | underscore@^1.12.1: 2073 | version "1.13.1" 2074 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1" 2075 | integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g== 2076 | 2077 | uri-js@^4.2.2: 2078 | version "4.2.2" 2079 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 2080 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 2081 | dependencies: 2082 | punycode "^2.1.0" 2083 | 2084 | url-join@^4.0.1: 2085 | version "4.0.1" 2086 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" 2087 | integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== 2088 | 2089 | url@^0.11.0: 2090 | version "0.11.0" 2091 | resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" 2092 | integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= 2093 | dependencies: 2094 | punycode "1.3.2" 2095 | querystring "0.2.0" 2096 | 2097 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 2098 | version "1.0.2" 2099 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2100 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 2101 | 2102 | v8-compile-cache@^2.0.3: 2103 | version "2.1.1" 2104 | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" 2105 | integrity sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ== 2106 | 2107 | vsce@^2.7.0: 2108 | version "2.7.0" 2109 | resolved "https://registry.yarnpkg.com/vsce/-/vsce-2.7.0.tgz#7be8deebd1e673b996238d608e7f7324c98744ed" 2110 | integrity sha512-CKU34wrQlbKDeJCRBkd1a8iwF9EvNxcYMg9hAUH6AxFGR6Wo2IKWwt3cJIcusHxx6XdjDHWlfAS/fJN30uvVnA== 2111 | dependencies: 2112 | azure-devops-node-api "^11.0.1" 2113 | chalk "^2.4.2" 2114 | cheerio "^1.0.0-rc.9" 2115 | commander "^6.1.0" 2116 | glob "^7.0.6" 2117 | hosted-git-info "^4.0.2" 2118 | keytar "^7.7.0" 2119 | leven "^3.1.0" 2120 | markdown-it "^12.3.2" 2121 | mime "^1.3.4" 2122 | minimatch "^3.0.3" 2123 | parse-semver "^1.1.1" 2124 | read "^1.0.7" 2125 | semver "^5.1.0" 2126 | tmp "^0.2.1" 2127 | typed-rest-client "^1.8.4" 2128 | url-join "^4.0.1" 2129 | xml2js "^0.4.23" 2130 | yauzl "^2.3.1" 2131 | yazl "^2.2.2" 2132 | 2133 | which@2.0.2, which@^2.0.1: 2134 | version "2.0.2" 2135 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2136 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2137 | dependencies: 2138 | isexe "^2.0.0" 2139 | 2140 | wide-align@^1.1.0: 2141 | version "1.1.5" 2142 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 2143 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 2144 | dependencies: 2145 | string-width "^1.0.2 || 2 || 3 || 4" 2146 | 2147 | word-wrap@^1.2.3: 2148 | version "1.2.4" 2149 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" 2150 | integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== 2151 | 2152 | workerpool@6.2.0: 2153 | version "6.2.0" 2154 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" 2155 | integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== 2156 | 2157 | wrap-ansi@^7.0.0: 2158 | version "7.0.0" 2159 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2160 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2161 | dependencies: 2162 | ansi-styles "^4.0.0" 2163 | string-width "^4.1.0" 2164 | strip-ansi "^6.0.0" 2165 | 2166 | wrappy@1: 2167 | version "1.0.2" 2168 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2169 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 2170 | 2171 | xml2js@^0.4.23: 2172 | version "0.4.23" 2173 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" 2174 | integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 2175 | dependencies: 2176 | sax ">=0.6.0" 2177 | xmlbuilder "~11.0.0" 2178 | 2179 | xmlbuilder@~11.0.0: 2180 | version "11.0.1" 2181 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 2182 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 2183 | 2184 | y18n@^5.0.5: 2185 | version "5.0.6" 2186 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.6.tgz#8236b05cfc5af6a409f41326a4847c68989bb04f" 2187 | integrity sha512-PlVX4Y0lDTN6E2V4ES2tEdyvXkeKzxa8c/vo0pxPr/TqbztddTP0yn7zZylIyiAuxerqj0Q5GhpJ1YJCP8LaZQ== 2188 | 2189 | yallist@^4.0.0: 2190 | version "4.0.0" 2191 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 2192 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 2193 | 2194 | yargs-parser@20.2.4: 2195 | version "20.2.4" 2196 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 2197 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 2198 | 2199 | yargs-parser@^20.2.2: 2200 | version "20.2.7" 2201 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a" 2202 | integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw== 2203 | 2204 | yargs-unparser@2.0.0: 2205 | version "2.0.0" 2206 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 2207 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 2208 | dependencies: 2209 | camelcase "^6.0.0" 2210 | decamelize "^4.0.0" 2211 | flat "^5.0.2" 2212 | is-plain-obj "^2.1.0" 2213 | 2214 | yargs@16.2.0: 2215 | version "16.2.0" 2216 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 2217 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 2218 | dependencies: 2219 | cliui "^7.0.2" 2220 | escalade "^3.1.1" 2221 | get-caller-file "^2.0.5" 2222 | require-directory "^2.1.1" 2223 | string-width "^4.2.0" 2224 | y18n "^5.0.5" 2225 | yargs-parser "^20.2.2" 2226 | 2227 | yauzl@^2.3.1: 2228 | version "2.10.0" 2229 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" 2230 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 2231 | dependencies: 2232 | buffer-crc32 "~0.2.3" 2233 | fd-slicer "~1.1.0" 2234 | 2235 | yazl@^2.2.2: 2236 | version "2.5.1" 2237 | resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35" 2238 | integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw== 2239 | dependencies: 2240 | buffer-crc32 "~0.2.3" 2241 | 2242 | yocto-queue@^0.1.0: 2243 | version "0.1.0" 2244 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2245 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2246 | --------------------------------------------------------------------------------