├── LICENSE
├── amd-gcn-isa
├── .gitignore
├── .vscode
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── README.md
├── package-lock.json
├── package.json
└── syntaxes
│ └── isa.tmLanguage
├── literal-preview
├── .gitignore
├── .vscode
│ ├── launch.json
│ ├── settings.json
│ └── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── README.md
├── package-lock.json
├── package.json
├── src
│ └── extension.ts
└── tsconfig.json
└── radeon-gpu-analyzer
├── .gitignore
├── .vscode
├── launch.json
├── settings.json
└── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── README.md
├── package-lock.json
├── package.json
├── src
├── amdilCommand.ts
├── dx11Command.ts
├── dx12Command.ts
├── extension.ts
├── rgaCommand.ts
├── spirvCommand.ts
└── vulkanCommand.ts
└── tsconfig.json
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/amd-gcn-isa/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
--------------------------------------------------------------------------------
/amd-gcn-isa/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that compiles the extension and then opens it inside a new window
2 | {
3 | "version": "0.1.0",
4 | "configurations": [
5 | {
6 | "name": "Launch Extension",
7 | "type": "extensionHost",
8 | "request": "launch",
9 | "runtimeExecutable": "${execPath}",
10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
11 | "stopOnEntry": false,
12 | "sourceMaps": true,
13 | "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
14 | "preLaunchTask": "npm"
15 | },
16 | {
17 | "name": "Launch Tests",
18 | "type": "extensionHost",
19 | "request": "launch",
20 | "runtimeExecutable": "${execPath}",
21 | "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
22 | "stopOnEntry": false,
23 | "sourceMaps": true,
24 | "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
25 | "preLaunchTask": "npm"
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/amd-gcn-isa/.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 | }
--------------------------------------------------------------------------------
/amd-gcn-isa/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | // Available variables which can be used inside of strings.
2 | // ${workspaceRoot}: the root folder of the team
3 | // ${file}: the current opened file
4 | // ${fileBasename}: the current opened file's basename
5 | // ${fileDirname}: the current opened file's dirname
6 | // ${fileExtname}: the current opened file's extension
7 | // ${cwd}: the current working directory of the spawned process
8 |
9 | // A task runner that calls a custom npm script that compiles the extension.
10 | {
11 | "version": "0.1.0",
12 |
13 | // we want to run npm
14 | "command": "npm",
15 |
16 | // the command is a shell script
17 | "isShellCommand": true,
18 |
19 | // show the output window only if unrecognized errors occur.
20 | "showOutput": "silent",
21 |
22 | // we run the custom script "compile" as defined in package.json
23 | "args": ["run", "compile", "--loglevel", "silent"],
24 |
25 | // The tsc compiler is started in watching mode
26 | "isBackground": true,
27 |
28 | // use the standard tsc in watch mode problem matcher to find compile problems in the output.
29 | "problemMatcher": "$tsc-watch"
30 | }
--------------------------------------------------------------------------------
/amd-gcn-isa/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | out/test/**
4 | test/**
5 | src/**
6 | **/*.map
7 | .gitignore
8 | tsconfig.json
9 | vsc-extension-quickstart.md
10 |
--------------------------------------------------------------------------------
/amd-gcn-isa/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ## 1.0.0
4 | Initial release.
--------------------------------------------------------------------------------
/amd-gcn-isa/README.md:
--------------------------------------------------------------------------------
1 | # AMD GCN ISA
2 |
3 | This extension provides a basic language support for the AMD GCN instruction set architecture.
4 |
5 | ## Features
6 |
7 | For files with the extensions
8 | - .isa
9 | - .isa.txt
10 | - .il
11 | - .il.txt
12 |
13 | the following tokens are emitted:
14 | - `storage.type.amd-gcn-isa`
15 | - `keyword.vector.amd-gcn-isa`
16 | - `keyword.scalar.amd-gcn-isa`
17 | - `keyword.control.label.amd-gcn-isa`
18 | - `support.variable.vector.amd-gcn-isa`
19 | - `support.variable.scalar.amd-gcn-isa`
20 | - `comment.line.double-slash.amd-gcn-isa`
21 | - `constant.numeric.float.amd-gcn-isa`
22 | - `constant.numeric.integer.amd-gcn-isa`
23 |
24 | For a starting point I recommend to add the following code snippet to your theme:
25 |
26 | ```json
27 | {
28 | "scope": "storage.type.amd-gcn-isa",
29 | "settings": {
30 | "foreground": "#CC3333"
31 | }
32 | },
33 | {
34 | "scope": "keyword.vector.amd-gcn-isa",
35 | "settings": {
36 | "foreground": "#33CCCC"
37 | }
38 | },
39 | {
40 | "scope": "keyword.scalar.amd-gcn-isa",
41 | "settings": {
42 | "foreground": "#CC33CC"
43 | }
44 | },
45 | {
46 | "scope": "support.variable.vector.amd-gcn-isa",
47 | "settings": {
48 | "foreground": "#CCCC33"
49 | }
50 | },
51 | {
52 | "scope": "support.variable.scalar.amd-gcn-isa",
53 | "settings": {
54 | "foreground": "#6495ED"
55 | }
56 | },
57 | {
58 | "scope": "keyword.control.label.amd-gcn-isa",
59 | "settings": {
60 | "foreground": "#33CC33"
61 | }
62 | }
63 | ```
64 |
65 | ## Release Notes
66 |
67 | ### 1.0.0
68 | Initial release.
69 |
70 | ## License
71 |
72 | This extension is under the MIT license. See [License](https://github.com/GPUOpen-Tools/vscode-extensions/blob/master/LICENSE) file for full license information.
--------------------------------------------------------------------------------
/amd-gcn-isa/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "amd-gcn-isa",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/vscode": {
8 | "version": "1.49.0",
9 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.49.0.tgz",
10 | "integrity": "sha512-wfNQmLmm1VdMBr6iuNdprWmC1YdrgZ9dQzadv+l2eSjJlElOdJw8OTm4RU4oGTBcfvG6RZI2jOcppkdSS18mZw=="
11 | }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/amd-gcn-isa/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "amd-gcn-isa",
3 | "displayName": "AMD GCN ISA",
4 | "description": "Language support for AMD GCN instruction set architecture.",
5 | "version": "1.0.0",
6 | "publisher": "dbaumeis",
7 | "engines": {
8 | "vscode": "^1.44.0"
9 | },
10 | "categories": [
11 | "Languages"
12 | ],
13 | "contributes": {
14 | "languages": [
15 | {
16 | "id": "amd-gcn-isa",
17 | "aliases": [
18 | "AMD GCN ISA",
19 | "isa"
20 | ],
21 | "extensions": [
22 | ".isa",
23 | ".il",
24 | ".isa.txt",
25 | ".il.txt"
26 | ],
27 | "configuration": "./language-configuration.json"
28 | }
29 | ],
30 | "grammars": [
31 | {
32 | "language": "amd-gcn-isa",
33 | "scopeName": "source.isa",
34 | "path": "./syntaxes/isa.tmLanguage"
35 | }
36 | ]
37 | },
38 | "dependencies": {
39 | "@types/vscode": "^1.49.0"
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/amd-gcn-isa/syntaxes/isa.tmLanguage:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | scopeName
6 | source.isa
7 |
8 | fileTypes
9 |
10 | isa
11 | il
12 | isa.txt
13 | il.txt
14 |
15 |
16 | name
17 | AMD GCN ISA
18 |
19 | patterns
20 |
21 |
22 | match
23 | \b((s_)?(ds|buffer|flat|image)_[a-zA-Z0-9_]+)\b
24 | name
25 | storage.type.amd-gcn-isa
26 |
27 |
28 | match
29 | \b(v_[a-zA-Z0-9_]+)\b
30 | name
31 | keyword.vector.amd-gcn-isa
32 |
33 |
34 | match
35 | \b(s_[a-zA-Z0-9_]+)\b
36 | name
37 | keyword.scalar.amd-gcn-isa
38 |
39 |
40 | match
41 | \b(label_[a-zA-Z0-9]+)\b
42 | name
43 | keyword.control.label.amd-gcn-isa
44 |
45 |
46 | match
47 | \b(v[0-9.]+|vcc|v)\b
48 | name
49 | support.variable.vector.amd-gcn-isa
50 |
51 |
52 | match
53 | \b(s[0-9.]+|s)\b
54 | name
55 | support.variable.scalar.amd-gcn-isa
56 |
57 |
58 | match
59 | //.*\n
60 | name
61 | comment.line.double-slash.amd-gcn-isa
62 |
63 |
64 | match
65 | \b[0-9]+\.[0-9]+\b
66 | name
67 | constant.numeric.float.amd-gcn-isa
68 |
69 |
70 | match
71 | \b(0x[a-zA-Z0-9]+)|([0-9]+)\b
72 | name
73 | constant.numeric.integer.amd-gcn-isa
74 |
75 |
76 |
77 |
--------------------------------------------------------------------------------
/literal-preview/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
--------------------------------------------------------------------------------
/literal-preview/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that compiles the extension and then opens it inside a new window
2 | {
3 | "version": "0.1.0",
4 | "configurations": [
5 | {
6 | "name": "Launch Extension",
7 | "type": "extensionHost",
8 | "request": "launch",
9 | "runtimeExecutable": "${execPath}",
10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
11 | "stopOnEntry": false,
12 | "sourceMaps": true,
13 | "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
14 | "preLaunchTask": "npm"
15 | },
16 | {
17 | "name": "Launch Tests",
18 | "type": "extensionHost",
19 | "request": "launch",
20 | "runtimeExecutable": "${execPath}",
21 | "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
22 | "stopOnEntry": false,
23 | "sourceMaps": true,
24 | "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
25 | "preLaunchTask": "npm"
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/literal-preview/.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 | }
--------------------------------------------------------------------------------
/literal-preview/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | // Available variables which can be used inside of strings.
2 | // ${workspaceRoot}: the root folder of the team
3 | // ${file}: the current opened file
4 | // ${fileBasename}: the current opened file's basename
5 | // ${fileDirname}: the current opened file's dirname
6 | // ${fileExtname}: the current opened file's extension
7 | // ${cwd}: the current working directory of the spawned process
8 |
9 | // A task runner that calls a custom npm script that compiles the extension.
10 | {
11 | "version": "0.1.0",
12 |
13 | // we want to run npm
14 | "command": "npm",
15 |
16 | // the command is a shell script
17 | "isShellCommand": true,
18 |
19 | // show the output window only if unrecognized errors occur.
20 | "showOutput": "silent",
21 |
22 | // we run the custom script "compile" as defined in package.json
23 | "args": ["run", "compile", "--loglevel", "silent"],
24 |
25 | // The tsc compiler is started in watching mode
26 | "isBackground": true,
27 |
28 | // use the standard tsc in watch mode problem matcher to find compile problems in the output.
29 | "problemMatcher": "$tsc-watch"
30 | }
--------------------------------------------------------------------------------
/literal-preview/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | out/test/**
4 | test/**
5 | src/**
6 | **/*.map
7 | .gitignore
8 | tsconfig.json
9 | vsc-extension-quickstart.md
10 |
--------------------------------------------------------------------------------
/literal-preview/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ## 1.0.2
4 | - Added NumPy license.
5 |
6 | ## 1.0.1
7 | - Recognize hexadecimal numbers only.
8 | - If the literal fits into 16bits, only those conversions are shown.
9 |
10 | ## 1.0.0
11 | - Initial release.
--------------------------------------------------------------------------------
/literal-preview/README.md:
--------------------------------------------------------------------------------
1 | # Literal Preview
2 |
3 | This extension provides a way to preview hexadecimal literals in different numerical representations when hovering over them.
4 |
5 | Open the command palette (`Ctrl+Shift+P`) and type `Enable: Preview Literals` to enable hovering over literals. Type `Disable: Preview Literals` to disable the feature.
6 |
7 |
8 | ## Features
9 |
10 | Previewing a **hexadecimal** literal as
11 | - 32bit **floating point** value
12 | - 2x 16bit **floating point** value
13 | - 32bit **signed integer** value
14 | - 2x 16bit **signed integer** value
15 | - 32bit **unsigned integer** value
16 | - 2x 16bit **unsigned integer** value
17 | - 16bit or 32bit **binary**
18 |
19 | The higher 16bit values are always shown first.
20 | If the literal fits into 16bit, only 16bit values are shown.
21 | If a literal maps to zero, no tooltip is shown.
22 |
23 | ## Known Issues
24 |
25 | - Negated literals are not recognized.
26 | - Hovering over floating point values interprets the pre-decimal positions as hexadecimal value.
27 |
28 | ## Release Notes
29 |
30 | ### 1.0.2
31 | - Added NumPy license.
32 |
33 | ### 1.0.1
34 | - Recognize hexadecimal numbers only.
35 | - If the literal fits into 16bits, only those conversions are shown.
36 |
37 | ### 1.0.0
38 | - Initial release.
39 |
40 | ## License
41 |
42 | This extension is under the MIT license. See [License](https://github.com/GPUOpen-Tools/vscode-extensions/blob/master/LICENSE) file for full license information.
43 |
44 | It contains parts of [NumPy](https://github.com/numpy/numpy), which is under BSD-3-Clause License:
45 |
46 | ```
47 | Copyright (c) 2005-2017, NumPy Developers.
48 | All rights reserved.
49 |
50 | Redistribution and use in source and binary forms, with or without
51 | modification, are permitted provided that the following conditions are
52 | met:
53 |
54 | * Redistributions of source code must retain the above copyright
55 | notice, this list of conditions and the following disclaimer.
56 |
57 | * Redistributions in binary form must reproduce the above
58 | copyright notice, this list of conditions and the following
59 | disclaimer in the documentation and/or other materials provided
60 | with the distribution.
61 |
62 | * Neither the name of the NumPy Developers nor the names of any
63 | contributors may be used to endorse or promote products derived
64 | from this software without specific prior written permission.
65 |
66 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
67 | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
68 | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
69 | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
70 | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
71 | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
72 | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
73 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
74 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
75 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
76 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
77 | ```
--------------------------------------------------------------------------------
/literal-preview/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "literal-preview",
3 | "version": "1.0.2",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/mocha": {
8 | "version": "2.2.48",
9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
10 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
11 | "dev": true
12 | },
13 | "@types/node": {
14 | "version": "6.14.11",
15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.11.tgz",
16 | "integrity": "sha512-htzPk08CmbGFjgIWaJut1oW2roZAAQxxOhkhsehCVLE7Uocx9wkcHfIQYdBWO7KqbuRvYrdBQtl5h5Mz/GxehA==",
17 | "dev": true
18 | },
19 | "@types/vscode": {
20 | "version": "1.49.0",
21 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.49.0.tgz",
22 | "integrity": "sha512-wfNQmLmm1VdMBr6iuNdprWmC1YdrgZ9dQzadv+l2eSjJlElOdJw8OTm4RU4oGTBcfvG6RZI2jOcppkdSS18mZw==",
23 | "dev": true
24 | },
25 | "ansi-colors": {
26 | "version": "3.2.3",
27 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
28 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
29 | "dev": true
30 | },
31 | "ansi-regex": {
32 | "version": "3.0.0",
33 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
34 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
35 | "dev": true
36 | },
37 | "ansi-styles": {
38 | "version": "3.2.1",
39 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
40 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
41 | "dev": true,
42 | "requires": {
43 | "color-convert": "^1.9.0"
44 | }
45 | },
46 | "anymatch": {
47 | "version": "3.1.1",
48 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
49 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
50 | "dev": true,
51 | "requires": {
52 | "normalize-path": "^3.0.0",
53 | "picomatch": "^2.0.4"
54 | }
55 | },
56 | "argparse": {
57 | "version": "1.0.10",
58 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
59 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
60 | "dev": true,
61 | "requires": {
62 | "sprintf-js": "~1.0.2"
63 | }
64 | },
65 | "balanced-match": {
66 | "version": "1.0.0",
67 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
68 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
69 | "dev": true
70 | },
71 | "binary-extensions": {
72 | "version": "2.1.0",
73 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
74 | "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
75 | "dev": true
76 | },
77 | "brace-expansion": {
78 | "version": "1.1.11",
79 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
80 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
81 | "dev": true,
82 | "requires": {
83 | "balanced-match": "^1.0.0",
84 | "concat-map": "0.0.1"
85 | }
86 | },
87 | "braces": {
88 | "version": "3.0.2",
89 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
90 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
91 | "dev": true,
92 | "requires": {
93 | "fill-range": "^7.0.1"
94 | }
95 | },
96 | "browser-stdout": {
97 | "version": "1.3.1",
98 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
99 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
100 | "dev": true
101 | },
102 | "camelcase": {
103 | "version": "5.3.1",
104 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
105 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
106 | "dev": true
107 | },
108 | "chalk": {
109 | "version": "2.4.2",
110 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
111 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
112 | "dev": true,
113 | "requires": {
114 | "ansi-styles": "^3.2.1",
115 | "escape-string-regexp": "^1.0.5",
116 | "supports-color": "^5.3.0"
117 | },
118 | "dependencies": {
119 | "supports-color": {
120 | "version": "5.5.0",
121 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
122 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
123 | "dev": true,
124 | "requires": {
125 | "has-flag": "^3.0.0"
126 | }
127 | }
128 | }
129 | },
130 | "chokidar": {
131 | "version": "3.3.0",
132 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
133 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
134 | "dev": true,
135 | "requires": {
136 | "anymatch": "~3.1.1",
137 | "braces": "~3.0.2",
138 | "fsevents": "~2.1.1",
139 | "glob-parent": "~5.1.0",
140 | "is-binary-path": "~2.1.0",
141 | "is-glob": "~4.0.1",
142 | "normalize-path": "~3.0.0",
143 | "readdirp": "~3.2.0"
144 | }
145 | },
146 | "cliui": {
147 | "version": "5.0.0",
148 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
149 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
150 | "dev": true,
151 | "requires": {
152 | "string-width": "^3.1.0",
153 | "strip-ansi": "^5.2.0",
154 | "wrap-ansi": "^5.1.0"
155 | },
156 | "dependencies": {
157 | "ansi-regex": {
158 | "version": "4.1.0",
159 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
160 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
161 | "dev": true
162 | },
163 | "string-width": {
164 | "version": "3.1.0",
165 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
166 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
167 | "dev": true,
168 | "requires": {
169 | "emoji-regex": "^7.0.1",
170 | "is-fullwidth-code-point": "^2.0.0",
171 | "strip-ansi": "^5.1.0"
172 | }
173 | },
174 | "strip-ansi": {
175 | "version": "5.2.0",
176 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
177 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
178 | "dev": true,
179 | "requires": {
180 | "ansi-regex": "^4.1.0"
181 | }
182 | }
183 | }
184 | },
185 | "color-convert": {
186 | "version": "1.9.3",
187 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
188 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
189 | "dev": true,
190 | "requires": {
191 | "color-name": "1.1.3"
192 | }
193 | },
194 | "color-name": {
195 | "version": "1.1.3",
196 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
197 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
198 | "dev": true
199 | },
200 | "concat-map": {
201 | "version": "0.0.1",
202 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
203 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
204 | "dev": true
205 | },
206 | "debug": {
207 | "version": "3.2.6",
208 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
209 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
210 | "dev": true,
211 | "requires": {
212 | "ms": "^2.1.1"
213 | }
214 | },
215 | "decamelize": {
216 | "version": "1.2.0",
217 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
218 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
219 | "dev": true
220 | },
221 | "define-properties": {
222 | "version": "1.1.3",
223 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
224 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
225 | "dev": true,
226 | "requires": {
227 | "object-keys": "^1.0.12"
228 | }
229 | },
230 | "diff": {
231 | "version": "3.5.0",
232 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
233 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
234 | "dev": true
235 | },
236 | "emoji-regex": {
237 | "version": "7.0.3",
238 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
239 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
240 | "dev": true
241 | },
242 | "es-abstract": {
243 | "version": "1.17.6",
244 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
245 | "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
246 | "dev": true,
247 | "requires": {
248 | "es-to-primitive": "^1.2.1",
249 | "function-bind": "^1.1.1",
250 | "has": "^1.0.3",
251 | "has-symbols": "^1.0.1",
252 | "is-callable": "^1.2.0",
253 | "is-regex": "^1.1.0",
254 | "object-inspect": "^1.7.0",
255 | "object-keys": "^1.1.1",
256 | "object.assign": "^4.1.0",
257 | "string.prototype.trimend": "^1.0.1",
258 | "string.prototype.trimstart": "^1.0.1"
259 | }
260 | },
261 | "es-to-primitive": {
262 | "version": "1.2.1",
263 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
264 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
265 | "dev": true,
266 | "requires": {
267 | "is-callable": "^1.1.4",
268 | "is-date-object": "^1.0.1",
269 | "is-symbol": "^1.0.2"
270 | }
271 | },
272 | "escape-string-regexp": {
273 | "version": "1.0.5",
274 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
275 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
276 | "dev": true
277 | },
278 | "esprima": {
279 | "version": "4.0.1",
280 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
281 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
282 | "dev": true
283 | },
284 | "fill-range": {
285 | "version": "7.0.1",
286 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
287 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
288 | "dev": true,
289 | "requires": {
290 | "to-regex-range": "^5.0.1"
291 | }
292 | },
293 | "find-up": {
294 | "version": "3.0.0",
295 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
296 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
297 | "dev": true,
298 | "requires": {
299 | "locate-path": "^3.0.0"
300 | }
301 | },
302 | "flat": {
303 | "version": "4.1.0",
304 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
305 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
306 | "dev": true,
307 | "requires": {
308 | "is-buffer": "~2.0.3"
309 | }
310 | },
311 | "fs.realpath": {
312 | "version": "1.0.0",
313 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
314 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
315 | "dev": true
316 | },
317 | "fsevents": {
318 | "version": "2.1.3",
319 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
320 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
321 | "dev": true,
322 | "optional": true
323 | },
324 | "function-bind": {
325 | "version": "1.1.1",
326 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
327 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
328 | "dev": true
329 | },
330 | "get-caller-file": {
331 | "version": "2.0.5",
332 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
333 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
334 | "dev": true
335 | },
336 | "glob": {
337 | "version": "7.1.3",
338 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
339 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
340 | "dev": true,
341 | "requires": {
342 | "fs.realpath": "^1.0.0",
343 | "inflight": "^1.0.4",
344 | "inherits": "2",
345 | "minimatch": "^3.0.4",
346 | "once": "^1.3.0",
347 | "path-is-absolute": "^1.0.0"
348 | }
349 | },
350 | "glob-parent": {
351 | "version": "5.1.1",
352 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
353 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
354 | "dev": true,
355 | "requires": {
356 | "is-glob": "^4.0.1"
357 | }
358 | },
359 | "growl": {
360 | "version": "1.10.5",
361 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
362 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
363 | "dev": true
364 | },
365 | "has": {
366 | "version": "1.0.3",
367 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
368 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
369 | "dev": true,
370 | "requires": {
371 | "function-bind": "^1.1.1"
372 | }
373 | },
374 | "has-flag": {
375 | "version": "3.0.0",
376 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
377 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
378 | "dev": true
379 | },
380 | "has-symbols": {
381 | "version": "1.0.1",
382 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
383 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
384 | "dev": true
385 | },
386 | "he": {
387 | "version": "1.2.0",
388 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
389 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
390 | "dev": true
391 | },
392 | "inflight": {
393 | "version": "1.0.6",
394 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
395 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
396 | "dev": true,
397 | "requires": {
398 | "once": "^1.3.0",
399 | "wrappy": "1"
400 | }
401 | },
402 | "inherits": {
403 | "version": "2.0.4",
404 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
405 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
406 | "dev": true
407 | },
408 | "is-binary-path": {
409 | "version": "2.1.0",
410 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
411 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
412 | "dev": true,
413 | "requires": {
414 | "binary-extensions": "^2.0.0"
415 | }
416 | },
417 | "is-buffer": {
418 | "version": "2.0.4",
419 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
420 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
421 | "dev": true
422 | },
423 | "is-callable": {
424 | "version": "1.2.1",
425 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.1.tgz",
426 | "integrity": "sha512-wliAfSzx6V+6WfMOmus1xy0XvSgf/dlStkvTfq7F0g4bOIW0PSUbnyse3NhDwdyYS1ozfUtAAySqTws3z9Eqgg==",
427 | "dev": true
428 | },
429 | "is-date-object": {
430 | "version": "1.0.2",
431 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
432 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
433 | "dev": true
434 | },
435 | "is-extglob": {
436 | "version": "2.1.1",
437 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
438 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
439 | "dev": true
440 | },
441 | "is-fullwidth-code-point": {
442 | "version": "2.0.0",
443 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
444 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
445 | "dev": true
446 | },
447 | "is-glob": {
448 | "version": "4.0.1",
449 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
450 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
451 | "dev": true,
452 | "requires": {
453 | "is-extglob": "^2.1.1"
454 | }
455 | },
456 | "is-number": {
457 | "version": "7.0.0",
458 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
459 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
460 | "dev": true
461 | },
462 | "is-regex": {
463 | "version": "1.1.1",
464 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
465 | "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
466 | "dev": true,
467 | "requires": {
468 | "has-symbols": "^1.0.1"
469 | }
470 | },
471 | "is-symbol": {
472 | "version": "1.0.3",
473 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
474 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
475 | "dev": true,
476 | "requires": {
477 | "has-symbols": "^1.0.1"
478 | }
479 | },
480 | "isexe": {
481 | "version": "2.0.0",
482 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
483 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
484 | "dev": true
485 | },
486 | "js-yaml": {
487 | "version": "3.13.1",
488 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
489 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
490 | "dev": true,
491 | "requires": {
492 | "argparse": "^1.0.7",
493 | "esprima": "^4.0.0"
494 | }
495 | },
496 | "locate-path": {
497 | "version": "3.0.0",
498 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
499 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
500 | "dev": true,
501 | "requires": {
502 | "p-locate": "^3.0.0",
503 | "path-exists": "^3.0.0"
504 | }
505 | },
506 | "lodash": {
507 | "version": "4.17.20",
508 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
509 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
510 | "dev": true
511 | },
512 | "log-symbols": {
513 | "version": "3.0.0",
514 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
515 | "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
516 | "dev": true,
517 | "requires": {
518 | "chalk": "^2.4.2"
519 | }
520 | },
521 | "minimatch": {
522 | "version": "3.0.4",
523 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
524 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
525 | "dev": true,
526 | "requires": {
527 | "brace-expansion": "^1.1.7"
528 | }
529 | },
530 | "minimist": {
531 | "version": "1.2.5",
532 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
533 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
534 | "dev": true
535 | },
536 | "mkdirp": {
537 | "version": "0.5.5",
538 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
539 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
540 | "dev": true,
541 | "requires": {
542 | "minimist": "^1.2.5"
543 | }
544 | },
545 | "mocha": {
546 | "version": "7.2.0",
547 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz",
548 | "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==",
549 | "dev": true,
550 | "requires": {
551 | "ansi-colors": "3.2.3",
552 | "browser-stdout": "1.3.1",
553 | "chokidar": "3.3.0",
554 | "debug": "3.2.6",
555 | "diff": "3.5.0",
556 | "escape-string-regexp": "1.0.5",
557 | "find-up": "3.0.0",
558 | "glob": "7.1.3",
559 | "growl": "1.10.5",
560 | "he": "1.2.0",
561 | "js-yaml": "3.13.1",
562 | "log-symbols": "3.0.0",
563 | "minimatch": "3.0.4",
564 | "mkdirp": "0.5.5",
565 | "ms": "2.1.1",
566 | "node-environment-flags": "1.0.6",
567 | "object.assign": "4.1.0",
568 | "strip-json-comments": "2.0.1",
569 | "supports-color": "6.0.0",
570 | "which": "1.3.1",
571 | "wide-align": "1.1.3",
572 | "yargs": "13.3.2",
573 | "yargs-parser": "13.1.2",
574 | "yargs-unparser": "1.6.0"
575 | }
576 | },
577 | "ms": {
578 | "version": "2.1.1",
579 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
580 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
581 | "dev": true
582 | },
583 | "node-environment-flags": {
584 | "version": "1.0.6",
585 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
586 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
587 | "dev": true,
588 | "requires": {
589 | "object.getownpropertydescriptors": "^2.0.3",
590 | "semver": "^5.7.0"
591 | }
592 | },
593 | "normalize-path": {
594 | "version": "3.0.0",
595 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
596 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
597 | "dev": true
598 | },
599 | "object-inspect": {
600 | "version": "1.8.0",
601 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
602 | "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
603 | "dev": true
604 | },
605 | "object-keys": {
606 | "version": "1.1.1",
607 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
608 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
609 | "dev": true
610 | },
611 | "object.assign": {
612 | "version": "4.1.0",
613 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
614 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
615 | "dev": true,
616 | "requires": {
617 | "define-properties": "^1.1.2",
618 | "function-bind": "^1.1.1",
619 | "has-symbols": "^1.0.0",
620 | "object-keys": "^1.0.11"
621 | }
622 | },
623 | "object.getownpropertydescriptors": {
624 | "version": "2.1.0",
625 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
626 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
627 | "dev": true,
628 | "requires": {
629 | "define-properties": "^1.1.3",
630 | "es-abstract": "^1.17.0-next.1"
631 | }
632 | },
633 | "once": {
634 | "version": "1.4.0",
635 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
636 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
637 | "dev": true,
638 | "requires": {
639 | "wrappy": "1"
640 | }
641 | },
642 | "p-limit": {
643 | "version": "2.3.0",
644 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
645 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
646 | "dev": true,
647 | "requires": {
648 | "p-try": "^2.0.0"
649 | }
650 | },
651 | "p-locate": {
652 | "version": "3.0.0",
653 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
654 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
655 | "dev": true,
656 | "requires": {
657 | "p-limit": "^2.0.0"
658 | }
659 | },
660 | "p-try": {
661 | "version": "2.2.0",
662 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
663 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
664 | "dev": true
665 | },
666 | "path-exists": {
667 | "version": "3.0.0",
668 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
669 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
670 | "dev": true
671 | },
672 | "path-is-absolute": {
673 | "version": "1.0.1",
674 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
675 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
676 | "dev": true
677 | },
678 | "picomatch": {
679 | "version": "2.2.2",
680 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
681 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
682 | "dev": true
683 | },
684 | "readdirp": {
685 | "version": "3.2.0",
686 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
687 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
688 | "dev": true,
689 | "requires": {
690 | "picomatch": "^2.0.4"
691 | }
692 | },
693 | "require-directory": {
694 | "version": "2.1.1",
695 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
696 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
697 | "dev": true
698 | },
699 | "require-main-filename": {
700 | "version": "2.0.0",
701 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
702 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
703 | "dev": true
704 | },
705 | "semver": {
706 | "version": "5.7.1",
707 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
708 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
709 | "dev": true
710 | },
711 | "set-blocking": {
712 | "version": "2.0.0",
713 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
714 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
715 | "dev": true
716 | },
717 | "sprintf-js": {
718 | "version": "1.0.3",
719 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
720 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
721 | "dev": true
722 | },
723 | "string-width": {
724 | "version": "2.1.1",
725 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
726 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
727 | "dev": true,
728 | "requires": {
729 | "is-fullwidth-code-point": "^2.0.0",
730 | "strip-ansi": "^4.0.0"
731 | }
732 | },
733 | "string.prototype.trimend": {
734 | "version": "1.0.1",
735 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
736 | "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
737 | "dev": true,
738 | "requires": {
739 | "define-properties": "^1.1.3",
740 | "es-abstract": "^1.17.5"
741 | }
742 | },
743 | "string.prototype.trimstart": {
744 | "version": "1.0.1",
745 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
746 | "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
747 | "dev": true,
748 | "requires": {
749 | "define-properties": "^1.1.3",
750 | "es-abstract": "^1.17.5"
751 | }
752 | },
753 | "strip-ansi": {
754 | "version": "4.0.0",
755 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
756 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
757 | "dev": true,
758 | "requires": {
759 | "ansi-regex": "^3.0.0"
760 | }
761 | },
762 | "strip-json-comments": {
763 | "version": "2.0.1",
764 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
765 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
766 | "dev": true
767 | },
768 | "supports-color": {
769 | "version": "6.0.0",
770 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
771 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
772 | "dev": true,
773 | "requires": {
774 | "has-flag": "^3.0.0"
775 | }
776 | },
777 | "to-regex-range": {
778 | "version": "5.0.1",
779 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
780 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
781 | "dev": true,
782 | "requires": {
783 | "is-number": "^7.0.0"
784 | }
785 | },
786 | "typescript": {
787 | "version": "2.9.2",
788 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
789 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
790 | "dev": true
791 | },
792 | "which": {
793 | "version": "1.3.1",
794 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
795 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
796 | "dev": true,
797 | "requires": {
798 | "isexe": "^2.0.0"
799 | }
800 | },
801 | "which-module": {
802 | "version": "2.0.0",
803 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
804 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
805 | "dev": true
806 | },
807 | "wide-align": {
808 | "version": "1.1.3",
809 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
810 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
811 | "dev": true,
812 | "requires": {
813 | "string-width": "^1.0.2 || 2"
814 | }
815 | },
816 | "wrap-ansi": {
817 | "version": "5.1.0",
818 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
819 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
820 | "dev": true,
821 | "requires": {
822 | "ansi-styles": "^3.2.0",
823 | "string-width": "^3.0.0",
824 | "strip-ansi": "^5.0.0"
825 | },
826 | "dependencies": {
827 | "ansi-regex": {
828 | "version": "4.1.0",
829 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
830 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
831 | "dev": true
832 | },
833 | "string-width": {
834 | "version": "3.1.0",
835 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
836 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
837 | "dev": true,
838 | "requires": {
839 | "emoji-regex": "^7.0.1",
840 | "is-fullwidth-code-point": "^2.0.0",
841 | "strip-ansi": "^5.1.0"
842 | }
843 | },
844 | "strip-ansi": {
845 | "version": "5.2.0",
846 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
847 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
848 | "dev": true,
849 | "requires": {
850 | "ansi-regex": "^4.1.0"
851 | }
852 | }
853 | }
854 | },
855 | "wrappy": {
856 | "version": "1.0.2",
857 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
858 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
859 | "dev": true
860 | },
861 | "y18n": {
862 | "version": "4.0.0",
863 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
864 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
865 | "dev": true
866 | },
867 | "yargs": {
868 | "version": "13.3.2",
869 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
870 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
871 | "dev": true,
872 | "requires": {
873 | "cliui": "^5.0.0",
874 | "find-up": "^3.0.0",
875 | "get-caller-file": "^2.0.1",
876 | "require-directory": "^2.1.1",
877 | "require-main-filename": "^2.0.0",
878 | "set-blocking": "^2.0.0",
879 | "string-width": "^3.0.0",
880 | "which-module": "^2.0.0",
881 | "y18n": "^4.0.0",
882 | "yargs-parser": "^13.1.2"
883 | },
884 | "dependencies": {
885 | "ansi-regex": {
886 | "version": "4.1.0",
887 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
888 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
889 | "dev": true
890 | },
891 | "string-width": {
892 | "version": "3.1.0",
893 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
894 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
895 | "dev": true,
896 | "requires": {
897 | "emoji-regex": "^7.0.1",
898 | "is-fullwidth-code-point": "^2.0.0",
899 | "strip-ansi": "^5.1.0"
900 | }
901 | },
902 | "strip-ansi": {
903 | "version": "5.2.0",
904 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
905 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
906 | "dev": true,
907 | "requires": {
908 | "ansi-regex": "^4.1.0"
909 | }
910 | }
911 | }
912 | },
913 | "yargs-parser": {
914 | "version": "13.1.2",
915 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
916 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
917 | "dev": true,
918 | "requires": {
919 | "camelcase": "^5.0.0",
920 | "decamelize": "^1.2.0"
921 | }
922 | },
923 | "yargs-unparser": {
924 | "version": "1.6.0",
925 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
926 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
927 | "dev": true,
928 | "requires": {
929 | "flat": "^4.1.0",
930 | "lodash": "^4.17.15",
931 | "yargs": "^13.3.0"
932 | }
933 | }
934 | }
935 | }
936 |
--------------------------------------------------------------------------------
/literal-preview/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "literal-preview",
3 | "displayName": "Literal Preview",
4 | "description": "Preview literals with different numerical representations.",
5 | "version": "1.0.2",
6 | "publisher": "dbaumeis",
7 | "engines": {
8 | "vscode": "^1.44.0"
9 | },
10 | "categories": [
11 | "Other"
12 | ],
13 | "activationEvents": [
14 | "onCommand:extension.enablePreviewLiterals",
15 | "onCommand:extension.disablePreviewLiterals"
16 | ],
17 | "main": "./out/src/extension",
18 | "contributes": {
19 | "commands": [
20 | {
21 | "command": "extension.enablePreviewLiterals",
22 | "title": "Enable: Preview Literals"
23 | },
24 | {
25 | "command": "extension.disablePreviewLiterals",
26 | "title": "Disable: Preview Literals"
27 | }
28 | ]
29 | },
30 | "scripts": {
31 | "vscode:prepublish": "tsc -p ./",
32 | "compile": "tsc -watch -p ./"
33 | },
34 | "devDependencies": {
35 | "@types/mocha": "^2.2.48",
36 | "@types/node": "^6.14.11",
37 | "@types/vscode": "^1.49.0",
38 | "mocha": "^7.2.0",
39 | "typescript": "^2.9.2"
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/literal-preview/src/extension.ts:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | // The module 'vscode' contains the VS Code extensibility API
3 | // Import the module and reference it with the alias vscode in your code below
4 | import * as vscode from 'vscode';
5 |
6 | function floatToInt32(text : string)
7 | {
8 | var buffer = new ArrayBuffer(4);
9 | var int32 = new Int32Array(buffer, 0, 1);
10 | var float32 = new Float32Array(buffer, 0, 1);
11 | float32[0] = parseFloat(text);
12 | return int32[0];
13 | }
14 |
15 | // Reference implementation from numpy:
16 | // https://github.com/numpy/numpy/blob/master/numpy/core/src/npymath/halffloat.c#L466
17 | function halfbitsToFloatBits(h : number)
18 | {
19 | // h is already 32bit
20 | var h_exp = h & 0x7c00;
21 | var f_sgn = (h & 0x8000) << 16;
22 |
23 | switch(h_exp)
24 | {
25 | case 0x0000: /* 0 or subnormal */
26 | var h_sig = h & 0x03ff;
27 |
28 | /* Signed zero */
29 | if (h_sig == 0)
30 | {
31 | return f_sgn;
32 | }
33 |
34 | /* Subnormal */
35 | h_sig <<= 1;
36 | while ( (h_sig & 0x0400) == 0)
37 | {
38 | h_sig <<= 1;
39 | h_exp++;
40 | }
41 |
42 | var f_exp = (127 - 15 - h_exp) << 23;
43 | var f_sig = (h_sig & 0x03ff) << 13;
44 | return f_sgn + f_exp + f_sig;
45 | case 0x7c00: /* inf or NaN */
46 | /* All-ones exponent and a copy of the significand */
47 | return f_sgn + 0x7f800000 + ((h & 0x03ff) << 13);
48 | default: /* normalized */
49 | /* Just need to adjust the exponent and shift */
50 | return f_sgn + (((h & 0x7fff) + 0x1c000) << 13);
51 | }
52 | }
53 |
54 | // Returns a float32 number that has the same value
55 | // as the float16 number represented by the bits in h.
56 | function asFloat32(halfBits : number)
57 | {
58 | var buffer = new ArrayBuffer(4);
59 | var uint32 = new Uint32Array(buffer, 0, 1);
60 | uint32[0] = halfbitsToFloatBits(halfBits);
61 |
62 | var float32 = new Float32Array(buffer, 0, 1);
63 | return float32[0];
64 | }
65 |
66 | function createRow(type : string, value : string)
67 | {
68 | type = (type + ': ').substring(0, 10);
69 | return '' + type + value + '\n'
70 | }
71 |
72 | function getFirstHexadecimal(text : string)
73 | {
74 | var regex = new RegExp('^(0[xX])?[0-9a-fA-F]+$');
75 | var match = text.match(regex);
76 |
77 | if(match.length > 0)
78 | {
79 | // Return first group
80 | return match[0];
81 | }
82 | return '';
83 | }
84 |
85 | function isNumberAndNotZero(text : string)
86 | {
87 | var number = new Number(text);
88 | return number != 0 && number != Number.NaN;
89 | }
90 |
91 | function zeroPad(text : string, length : number)
92 | {
93 | var pad = new Array(length).fill('0').join('');
94 | pad = (pad + text);
95 | return pad.substring(pad.length - length);
96 | }
97 |
98 | function prepareHoverText(text : string)
99 | {
100 | var asInt32 = parseInt(text, 16);
101 | var buffer = new ArrayBuffer(4);
102 | var int32Arr = new Int32Array(buffer, 0, 1);
103 | int32Arr[0] = asInt32;
104 |
105 | var float32Arr = new Float32Array(buffer, 0, 1);
106 | var int16Arr = new Int16Array(buffer, 0, 2);
107 | var uint32Arr = new Uint32Array(buffer, 0, 1);
108 | var uint16Arr = new Uint16Array(buffer, 0, 2);
109 | var float16high = asFloat32(int16Arr[1]);
110 | var float16low = asFloat32(int16Arr[0]);
111 |
112 | var hoverText = '';
113 | if(uint16Arr[1] != 0)
114 | {
115 | var binary = uint32Arr[0].toString(2);
116 | binary = zeroPad(binary, 32);
117 | // Show the conversion for 32bit, if more than 16bit are used
118 | hoverText += createRow('Float32', '' + float32Arr[0].toPrecision(8))
119 | + createRow('Float16', '' + float16high.toPrecision(5) + ' : ' + float16low.toPrecision(5))
120 | + createRow('Int32', '' + int32Arr[0])
121 | + createRow('Int16', '' + int16Arr[1] + ' : ' + int16Arr[0])
122 | + createRow('Uint32', '' + uint32Arr[0])
123 | + createRow('Uint16', '' + uint16Arr[1] + ' : ' + uint16Arr[0])
124 | + createRow('Binary', binary);
125 | }
126 | else {
127 | var binary = uint16Arr[0].toString(2);
128 | binary = zeroPad(binary, 16);
129 | hoverText += createRow('Float16', '' + float16low.toPrecision(5))
130 | + createRow('Int16', '' + int16Arr[0])
131 | + createRow('Uint16', '' + uint16Arr[0])
132 | + createRow('Binary', binary);
133 | }
134 |
135 | var markedString : vscode.MarkedString = {
136 | language: 'html',
137 | value: hoverText
138 | }
139 |
140 | return markedString;
141 | }
142 |
143 | class LiteralPreviewHoverProvider implements vscode.HoverProvider
144 | {
145 | private isActive = false;
146 | public setActive(active)
147 | {
148 | this.isActive = active;
149 | }
150 |
151 | public provideHover(document, position, token)
152 | {
153 | if(this.isActive)
154 | {
155 | var range = document.getWordRangeAtPosition(position);
156 | var selectedText = document.getText(range);
157 |
158 | // Check if we have to display anything,
159 | // i.e. we can make a hex number out of the selected text.
160 | selectedText = getFirstHexadecimal(selectedText);
161 | if(isNumberAndNotZero(selectedText)) {
162 | var hoverText = prepareHoverText(selectedText);
163 | return new vscode.Hover(hoverText);
164 | }
165 | }
166 | }
167 | }
168 |
169 | // This method is called when your extension is activated
170 | export function activate(context: vscode.ExtensionContext)
171 | {
172 | var provider = new LiteralPreviewHoverProvider();
173 | vscode.languages.registerHoverProvider('*', provider);
174 |
175 | // The command has been defined in the package.json file
176 | // Now provide the implementation of the command with registerCommand
177 | // The commandId parameter must match the command field in package.json
178 | var enableCommand = vscode.commands.registerCommand('extension.enablePreviewLiterals', () => {
179 | provider.setActive(true);
180 | });
181 | context.subscriptions.push(enableCommand);
182 |
183 | var disableCommand = vscode.commands.registerCommand('extension.disablePreviewLiterals', () => {
184 | provider.setActive(false);
185 | });
186 | context.subscriptions.push(disableCommand);
187 | }
188 |
189 | // This method is called when your extension is deactivated
190 | export function deactivate()
191 | {
192 | // Empty
193 | }
--------------------------------------------------------------------------------
/literal-preview/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "es6",
5 | "outDir": "out",
6 | "lib": [
7 | "es6"
8 | ],
9 | "sourceMap": true,
10 | "rootDir": "."
11 | },
12 | "exclude": [
13 | "node_modules",
14 | ".vscode-test"
15 | ]
16 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/.gitignore:
--------------------------------------------------------------------------------
1 | out
2 | node_modules
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that compiles the extension and then opens it inside a new window
2 | {
3 | "version": "0.1.0",
4 | "configurations": [
5 | {
6 | "name": "Launch Extension",
7 | "type": "extensionHost",
8 | "request": "launch",
9 | "runtimeExecutable": "${execPath}",
10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
11 | "stopOnEntry": false,
12 | "sourceMaps": true,
13 | "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
14 | "preLaunchTask": "npm"
15 | },
16 | {
17 | "name": "Launch Tests",
18 | "type": "extensionHost",
19 | "request": "launch",
20 | "runtimeExecutable": "${execPath}",
21 | "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
22 | "stopOnEntry": false,
23 | "sourceMaps": true,
24 | "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
25 | "preLaunchTask": "npm"
26 | }
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/.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 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | // Available variables which can be used inside of strings.
2 | // ${workspaceRoot}: the root folder of the team
3 | // ${file}: the current opened file
4 | // ${fileBasename}: the current opened file's basename
5 | // ${fileDirname}: the current opened file's dirname
6 | // ${fileExtname}: the current opened file's extension
7 | // ${cwd}: the current working directory of the spawned process
8 |
9 | // A task runner that calls a custom npm script that compiles the extension.
10 | {
11 | "version": "0.1.0",
12 |
13 | // we want to run npm
14 | "command": "npm",
15 |
16 | // the command is a shell script
17 | "isShellCommand": true,
18 |
19 | // show the output window only if unrecognized errors occur.
20 | "showOutput": "silent",
21 |
22 | // we run the custom script "compile" as defined in package.json
23 | "args": ["run", "compile", "--loglevel", "silent"],
24 |
25 | // The tsc compiler is started in watching mode
26 | "isBackground": true,
27 |
28 | // use the standard tsc in watch mode problem matcher to find compile problems in the output.
29 | "problemMatcher": "$tsc-watch"
30 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | out/test/**
4 | test/**
5 | src/**
6 | **/*.map
7 | .gitignore
8 | tsconfig.json
9 | vsc-extension-quickstart.md
10 |
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | ### 1.1.1
4 | - Use child process to execute commands.
5 |
6 | ### 1.1.0
7 |
8 | - Added support for compiling DX12 compute shaders introduced with RGA 2.2.
9 | - Added support for compiling DX12 graphics pipelines introduced with RGA 2.3.
10 | - Added support for RDNA targets (gfx1010 = Navi10 and gfx1012 = Navi14).
11 | - Removed certain keybindings as they became ambiguous with the introduction of DX12.
12 |
13 | ## 1.0.1
14 | - Readme fixes.
15 |
16 | ## 1.0.0
17 | - Initial release
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/README.md:
--------------------------------------------------------------------------------
1 | # VSCode: Radeon GPU Analyzer
2 |
3 | This is a Visual Studio Code extension for the [Radeon GPU Analyzer](https://github.com/GPUOpen-Tools/RGA) (RGA). It aims to make RGA usable directly from within VSCode. For now RGA 2.3 is supported. Later versions may work out of the box.
4 |
5 | ## Features
6 |
7 | - View the disassembly from compiling HLSL, SPIR-V and Vulkan (GLSL) shaders down to AMD IL and AMD GCN/RDNA ISA.
8 | - View the disassembly from compiling AMD IL shaders to AMD GCN/RDNA ISA.
9 | - The current word selection is used as entry function of your shader.
10 | - The shader model / shader type and the target architecture are chosen via drop down menus.
11 | - The last command per shader is saved and can be replayed. This allows you to spot the impact your code changes have on the ISA.
12 | - If you open the shader in a VSCode project, created files will open in a new view.
13 |
14 | ## Usage
15 |
16 | All commands are accessible from the command palette (`Ctrl+Shift+P`).
17 | Supported commands:
18 | - Call RGA: Vulkan
19 | - Call RGA: SPIR-V
20 | - Call RGA: AMD IL
21 | - Call RGA: DX11
22 | - Call RGA: DX12
23 | - Replay RGA (default key binding: `F7`)
24 |
25 | E.g. to compile an HLSL shader for the use on RX 5700 XT:
26 | 1. Open VSCode in a parent directory of your shader.
27 | 2. Open your shader in VSCode.
28 | 3. Select the `entry function name` of your shader.
29 | 4. `Ctrl+Shift+P`
30 | 5. Enter the command "Call RGA: DX12"
31 | 6. Choose your preferred shader profile from the drop down. E.g. cs_6_0 for a compute shader on Shader Model 6.0.
32 | 7. Choose your preferred target architecture. For RX 5700 XT that would be `gfx1010` - call RGA.exe directly to show the full list of supported ASICs.
33 | 8. If your shader compiles successfully, the resulting AMD IL and AMD GCN/RDNA ISA disassembly will open in separate views.
34 |
35 | ## Notes
36 |
37 | - AMD IL does not require an entry point, no need to do step `3` in that case.
38 | - All files are created next to the shader source file.
39 | - RGA will prefix the generated ISA and IL filenames with the name of the GPU family you are compiling for, and the function entry point if that applies.
40 | - RGA does not support AMD IL for DX12 shaders as of version 2.2 - the compiled DXIL is shown instead.
41 | - DX12 shaders must define and reference the root signature through the [RootSignature()] attribute or use `--rs-bin` as a custom argument.
42 | - Compiling DX12 graphics (= non-compute) pipelines requires to select multiple entry points beforehand. The standard keyboard shortcut in VS Code for multi selection is `Alt`.
43 | - Compiling DX12 graphics pipelines also requires a `gpso` file that provides additional information about the pipeline. For compute shaders just leave the selection empty.
44 |
45 | ## Requirements
46 |
47 | To use this extension you have to download RGA separately and point to the rga.exe in your settings.
48 | Download RGA from [Github](https://github.com/GPUOpen-Tools/RGA/releases). Note that for now version 2.3 is supported. Later versions may work out of the box.
49 |
50 | ## Source
51 |
52 | The source code can be found on [Github](https://github.com/GPUOpen-Tools/vscode-extensions/tree/master/radeon-gpu-analyzer).
53 |
54 | ## Key Bindings
55 |
56 | - `"extension.replayRga"` - default: `"F7"`
57 |
58 | ## Settings
59 |
60 | - `"rga.path"` Path to the RGA executable.
61 | - `"rga.arguments.dx11"` Define additional arguments to pass to RGA - `DX11`, e.g. `'--intrinsics --UAVSlot 63'`
62 | - `"rga.arguments.dx12"` Define additional arguments to pass to RGA - `DX12`, e.g. `'--intrinsics --UAVSlot 63'`
63 | - `"rga.arguments.vulkan"` Define additional arguments to pass to RGA - `Vulkan`, e.g. `'--cfg control_flow_graph'`
64 | - `"rga.arguments.spirv"` Define additional arguments to pass to RGA - `SPIR-V`, e.g. `'--cfg control_flow_graph'`
65 | - `"rga.arguments.amdil"` Define additional arguments to pass to RGA - `AMD IL`, e.g. `'--cfg control_flow_graph'`
66 | - `"rga.viewColumn.il"` Number of the view column the `output IL` will be shown (1, 2 or 3). Pass in -1 if you don't want to open the IL.
67 | - `"rga.viewColumn.isa"` Number of the view column the `output ISA` will be shown (1, 2 or 3). Pass in -1 if you don't want to open the ISA.
68 |
69 | ## Release Notes
70 |
71 | ### 1.1.1
72 | - Use child process to execute commands.
73 |
74 | ### 1.1.0
75 |
76 | - Added support for compiling DX12 compute shaders introduced with RGA 2.2.
77 | - Added support for compiling DX12 graphics pipelines introduced with RGA 2.3.
78 | - Added support for RDNA targets (gfx1010 = Navi10 and gfx1012 = Navi14).
79 | - Removed certain keybindings as they became ambiguous with the introduction of DX12.
80 |
81 | ### 1.0.1
82 |
83 | - Readme fixes.
84 |
85 | ### 1.0.0
86 |
87 | - Initial release.
88 |
89 | ## License
90 |
91 | - This extension is under the MIT license. See [License](https://github.com/GPUOpen-Tools/vscode-extensions/blob/master/LICENSE) file for full license information.
92 |
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "radeon-gpu-analyzer",
3 | "version": "1.1.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/mocha": {
8 | "version": "2.2.48",
9 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
10 | "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
11 | "dev": true
12 | },
13 | "@types/node": {
14 | "version": "6.14.11",
15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.11.tgz",
16 | "integrity": "sha512-htzPk08CmbGFjgIWaJut1oW2roZAAQxxOhkhsehCVLE7Uocx9wkcHfIQYdBWO7KqbuRvYrdBQtl5h5Mz/GxehA==",
17 | "dev": true
18 | },
19 | "@types/vscode": {
20 | "version": "1.49.0",
21 | "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.49.0.tgz",
22 | "integrity": "sha512-wfNQmLmm1VdMBr6iuNdprWmC1YdrgZ9dQzadv+l2eSjJlElOdJw8OTm4RU4oGTBcfvG6RZI2jOcppkdSS18mZw==",
23 | "dev": true
24 | },
25 | "ansi-colors": {
26 | "version": "3.2.3",
27 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
28 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
29 | "dev": true
30 | },
31 | "ansi-regex": {
32 | "version": "3.0.0",
33 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
34 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
35 | "dev": true
36 | },
37 | "ansi-styles": {
38 | "version": "3.2.1",
39 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
40 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
41 | "dev": true,
42 | "requires": {
43 | "color-convert": "^1.9.0"
44 | }
45 | },
46 | "argparse": {
47 | "version": "1.0.10",
48 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
49 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
50 | "dev": true,
51 | "requires": {
52 | "sprintf-js": "~1.0.2"
53 | }
54 | },
55 | "balanced-match": {
56 | "version": "1.0.0",
57 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
58 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
59 | "dev": true
60 | },
61 | "brace-expansion": {
62 | "version": "1.1.11",
63 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
64 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
65 | "dev": true,
66 | "requires": {
67 | "balanced-match": "^1.0.0",
68 | "concat-map": "0.0.1"
69 | }
70 | },
71 | "browser-stdout": {
72 | "version": "1.3.1",
73 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
74 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
75 | "dev": true
76 | },
77 | "camelcase": {
78 | "version": "5.3.1",
79 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
80 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
81 | "dev": true
82 | },
83 | "chalk": {
84 | "version": "2.4.2",
85 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
86 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
87 | "dev": true,
88 | "requires": {
89 | "ansi-styles": "^3.2.1",
90 | "escape-string-regexp": "^1.0.5",
91 | "supports-color": "^5.3.0"
92 | },
93 | "dependencies": {
94 | "supports-color": {
95 | "version": "5.5.0",
96 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
97 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
98 | "dev": true,
99 | "requires": {
100 | "has-flag": "^3.0.0"
101 | }
102 | }
103 | }
104 | },
105 | "cliui": {
106 | "version": "5.0.0",
107 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
108 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
109 | "dev": true,
110 | "requires": {
111 | "string-width": "^3.1.0",
112 | "strip-ansi": "^5.2.0",
113 | "wrap-ansi": "^5.1.0"
114 | },
115 | "dependencies": {
116 | "ansi-regex": {
117 | "version": "4.1.0",
118 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
119 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
120 | "dev": true
121 | },
122 | "string-width": {
123 | "version": "3.1.0",
124 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
125 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
126 | "dev": true,
127 | "requires": {
128 | "emoji-regex": "^7.0.1",
129 | "is-fullwidth-code-point": "^2.0.0",
130 | "strip-ansi": "^5.1.0"
131 | }
132 | },
133 | "strip-ansi": {
134 | "version": "5.2.0",
135 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
136 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
137 | "dev": true,
138 | "requires": {
139 | "ansi-regex": "^4.1.0"
140 | }
141 | }
142 | }
143 | },
144 | "color-convert": {
145 | "version": "1.9.3",
146 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
147 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
148 | "dev": true,
149 | "requires": {
150 | "color-name": "1.1.3"
151 | }
152 | },
153 | "color-name": {
154 | "version": "1.1.3",
155 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
156 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
157 | "dev": true
158 | },
159 | "concat-map": {
160 | "version": "0.0.1",
161 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
162 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
163 | "dev": true
164 | },
165 | "debug": {
166 | "version": "3.2.6",
167 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
168 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
169 | "dev": true,
170 | "requires": {
171 | "ms": "^2.1.1"
172 | }
173 | },
174 | "decamelize": {
175 | "version": "1.2.0",
176 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
177 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
178 | "dev": true
179 | },
180 | "define-properties": {
181 | "version": "1.1.3",
182 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
183 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
184 | "dev": true,
185 | "requires": {
186 | "object-keys": "^1.0.12"
187 | }
188 | },
189 | "diff": {
190 | "version": "3.5.0",
191 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
192 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
193 | "dev": true
194 | },
195 | "emoji-regex": {
196 | "version": "7.0.3",
197 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
198 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
199 | "dev": true
200 | },
201 | "es-abstract": {
202 | "version": "1.17.5",
203 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
204 | "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
205 | "dev": true,
206 | "requires": {
207 | "es-to-primitive": "^1.2.1",
208 | "function-bind": "^1.1.1",
209 | "has": "^1.0.3",
210 | "has-symbols": "^1.0.1",
211 | "is-callable": "^1.1.5",
212 | "is-regex": "^1.0.5",
213 | "object-inspect": "^1.7.0",
214 | "object-keys": "^1.1.1",
215 | "object.assign": "^4.1.0",
216 | "string.prototype.trimleft": "^2.1.1",
217 | "string.prototype.trimright": "^2.1.1"
218 | }
219 | },
220 | "es-to-primitive": {
221 | "version": "1.2.1",
222 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
223 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
224 | "dev": true,
225 | "requires": {
226 | "is-callable": "^1.1.4",
227 | "is-date-object": "^1.0.1",
228 | "is-symbol": "^1.0.2"
229 | }
230 | },
231 | "escape-string-regexp": {
232 | "version": "1.0.5",
233 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
234 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
235 | "dev": true
236 | },
237 | "esprima": {
238 | "version": "4.0.1",
239 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
240 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
241 | "dev": true
242 | },
243 | "find-up": {
244 | "version": "3.0.0",
245 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
246 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
247 | "dev": true,
248 | "requires": {
249 | "locate-path": "^3.0.0"
250 | }
251 | },
252 | "flat": {
253 | "version": "4.1.0",
254 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
255 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
256 | "dev": true,
257 | "requires": {
258 | "is-buffer": "~2.0.3"
259 | }
260 | },
261 | "fs.realpath": {
262 | "version": "1.0.0",
263 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
264 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
265 | "dev": true
266 | },
267 | "function-bind": {
268 | "version": "1.1.1",
269 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
270 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
271 | "dev": true
272 | },
273 | "get-caller-file": {
274 | "version": "2.0.5",
275 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
276 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
277 | "dev": true
278 | },
279 | "glob": {
280 | "version": "7.1.3",
281 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
282 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
283 | "dev": true,
284 | "requires": {
285 | "fs.realpath": "^1.0.0",
286 | "inflight": "^1.0.4",
287 | "inherits": "2",
288 | "minimatch": "^3.0.4",
289 | "once": "^1.3.0",
290 | "path-is-absolute": "^1.0.0"
291 | }
292 | },
293 | "growl": {
294 | "version": "1.10.5",
295 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
296 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
297 | "dev": true
298 | },
299 | "has": {
300 | "version": "1.0.3",
301 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
302 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
303 | "dev": true,
304 | "requires": {
305 | "function-bind": "^1.1.1"
306 | }
307 | },
308 | "has-flag": {
309 | "version": "3.0.0",
310 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
311 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
312 | "dev": true
313 | },
314 | "has-symbols": {
315 | "version": "1.0.1",
316 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
317 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
318 | "dev": true
319 | },
320 | "he": {
321 | "version": "1.2.0",
322 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
323 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
324 | "dev": true
325 | },
326 | "inflight": {
327 | "version": "1.0.6",
328 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
329 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
330 | "dev": true,
331 | "requires": {
332 | "once": "^1.3.0",
333 | "wrappy": "1"
334 | }
335 | },
336 | "inherits": {
337 | "version": "2.0.3",
338 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
339 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
340 | "dev": true
341 | },
342 | "is-buffer": {
343 | "version": "2.0.4",
344 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
345 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
346 | "dev": true
347 | },
348 | "is-callable": {
349 | "version": "1.1.5",
350 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
351 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
352 | "dev": true
353 | },
354 | "is-date-object": {
355 | "version": "1.0.2",
356 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
357 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
358 | "dev": true
359 | },
360 | "is-fullwidth-code-point": {
361 | "version": "2.0.0",
362 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
363 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
364 | "dev": true
365 | },
366 | "is-regex": {
367 | "version": "1.0.5",
368 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
369 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
370 | "dev": true,
371 | "requires": {
372 | "has": "^1.0.3"
373 | }
374 | },
375 | "is-symbol": {
376 | "version": "1.0.3",
377 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
378 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
379 | "dev": true,
380 | "requires": {
381 | "has-symbols": "^1.0.1"
382 | }
383 | },
384 | "isexe": {
385 | "version": "2.0.0",
386 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
387 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
388 | "dev": true
389 | },
390 | "js-yaml": {
391 | "version": "3.13.1",
392 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
393 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
394 | "dev": true,
395 | "requires": {
396 | "argparse": "^1.0.7",
397 | "esprima": "^4.0.0"
398 | }
399 | },
400 | "locate-path": {
401 | "version": "3.0.0",
402 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
403 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
404 | "dev": true,
405 | "requires": {
406 | "p-locate": "^3.0.0",
407 | "path-exists": "^3.0.0"
408 | }
409 | },
410 | "lodash": {
411 | "version": "4.17.19",
412 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
413 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
414 | "dev": true
415 | },
416 | "log-symbols": {
417 | "version": "2.2.0",
418 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
419 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
420 | "dev": true,
421 | "requires": {
422 | "chalk": "^2.0.1"
423 | }
424 | },
425 | "minimatch": {
426 | "version": "3.0.4",
427 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
428 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
429 | "dev": true,
430 | "requires": {
431 | "brace-expansion": "^1.1.7"
432 | }
433 | },
434 | "mocha": {
435 | "version": "6.2.3",
436 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz",
437 | "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==",
438 | "dev": true,
439 | "requires": {
440 | "ansi-colors": "3.2.3",
441 | "browser-stdout": "1.3.1",
442 | "debug": "3.2.6",
443 | "diff": "3.5.0",
444 | "escape-string-regexp": "1.0.5",
445 | "find-up": "3.0.0",
446 | "glob": "7.1.3",
447 | "growl": "1.10.5",
448 | "he": "1.2.0",
449 | "js-yaml": "3.13.1",
450 | "log-symbols": "2.2.0",
451 | "minimatch": "3.0.4",
452 | "mkdirp": "0.5.4",
453 | "ms": "2.1.1",
454 | "node-environment-flags": "1.0.5",
455 | "object.assign": "4.1.0",
456 | "strip-json-comments": "2.0.1",
457 | "supports-color": "6.0.0",
458 | "which": "1.3.1",
459 | "wide-align": "1.1.3",
460 | "yargs": "13.3.2",
461 | "yargs-parser": "13.1.2",
462 | "yargs-unparser": "1.6.0"
463 | },
464 | "dependencies": {
465 | "minimist": {
466 | "version": "1.2.5",
467 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
468 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
469 | "dev": true
470 | },
471 | "mkdirp": {
472 | "version": "0.5.4",
473 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz",
474 | "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==",
475 | "dev": true,
476 | "requires": {
477 | "minimist": "^1.2.5"
478 | }
479 | }
480 | }
481 | },
482 | "ms": {
483 | "version": "2.1.1",
484 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
485 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
486 | "dev": true
487 | },
488 | "node-environment-flags": {
489 | "version": "1.0.5",
490 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
491 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
492 | "dev": true,
493 | "requires": {
494 | "object.getownpropertydescriptors": "^2.0.3",
495 | "semver": "^5.7.0"
496 | }
497 | },
498 | "object-inspect": {
499 | "version": "1.7.0",
500 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
501 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
502 | "dev": true
503 | },
504 | "object-keys": {
505 | "version": "1.1.1",
506 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
507 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
508 | "dev": true
509 | },
510 | "object.assign": {
511 | "version": "4.1.0",
512 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
513 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
514 | "dev": true,
515 | "requires": {
516 | "define-properties": "^1.1.2",
517 | "function-bind": "^1.1.1",
518 | "has-symbols": "^1.0.0",
519 | "object-keys": "^1.0.11"
520 | }
521 | },
522 | "object.getownpropertydescriptors": {
523 | "version": "2.1.0",
524 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
525 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
526 | "dev": true,
527 | "requires": {
528 | "define-properties": "^1.1.3",
529 | "es-abstract": "^1.17.0-next.1"
530 | }
531 | },
532 | "once": {
533 | "version": "1.4.0",
534 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
535 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
536 | "dev": true,
537 | "requires": {
538 | "wrappy": "1"
539 | }
540 | },
541 | "p-limit": {
542 | "version": "2.2.2",
543 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
544 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
545 | "dev": true,
546 | "requires": {
547 | "p-try": "^2.0.0"
548 | }
549 | },
550 | "p-locate": {
551 | "version": "3.0.0",
552 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
553 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
554 | "dev": true,
555 | "requires": {
556 | "p-limit": "^2.0.0"
557 | }
558 | },
559 | "p-try": {
560 | "version": "2.2.0",
561 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
562 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
563 | "dev": true
564 | },
565 | "path-exists": {
566 | "version": "3.0.0",
567 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
568 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
569 | "dev": true
570 | },
571 | "path-is-absolute": {
572 | "version": "1.0.1",
573 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
574 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
575 | "dev": true
576 | },
577 | "require-directory": {
578 | "version": "2.1.1",
579 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
580 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
581 | "dev": true
582 | },
583 | "require-main-filename": {
584 | "version": "2.0.0",
585 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
586 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
587 | "dev": true
588 | },
589 | "semver": {
590 | "version": "5.7.1",
591 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
592 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
593 | "dev": true
594 | },
595 | "set-blocking": {
596 | "version": "2.0.0",
597 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
598 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
599 | "dev": true
600 | },
601 | "sprintf-js": {
602 | "version": "1.0.3",
603 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
604 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
605 | "dev": true
606 | },
607 | "string-width": {
608 | "version": "2.1.1",
609 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
610 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
611 | "dev": true,
612 | "requires": {
613 | "is-fullwidth-code-point": "^2.0.0",
614 | "strip-ansi": "^4.0.0"
615 | }
616 | },
617 | "string.prototype.trimend": {
618 | "version": "1.0.0",
619 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz",
620 | "integrity": "sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA==",
621 | "dev": true,
622 | "requires": {
623 | "define-properties": "^1.1.3",
624 | "es-abstract": "^1.17.5"
625 | }
626 | },
627 | "string.prototype.trimleft": {
628 | "version": "2.1.2",
629 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
630 | "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
631 | "dev": true,
632 | "requires": {
633 | "define-properties": "^1.1.3",
634 | "es-abstract": "^1.17.5",
635 | "string.prototype.trimstart": "^1.0.0"
636 | }
637 | },
638 | "string.prototype.trimright": {
639 | "version": "2.1.2",
640 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
641 | "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
642 | "dev": true,
643 | "requires": {
644 | "define-properties": "^1.1.3",
645 | "es-abstract": "^1.17.5",
646 | "string.prototype.trimend": "^1.0.0"
647 | }
648 | },
649 | "string.prototype.trimstart": {
650 | "version": "1.0.0",
651 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz",
652 | "integrity": "sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w==",
653 | "dev": true,
654 | "requires": {
655 | "define-properties": "^1.1.3",
656 | "es-abstract": "^1.17.5"
657 | }
658 | },
659 | "strip-ansi": {
660 | "version": "4.0.0",
661 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
662 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
663 | "dev": true,
664 | "requires": {
665 | "ansi-regex": "^3.0.0"
666 | }
667 | },
668 | "strip-json-comments": {
669 | "version": "2.0.1",
670 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
671 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
672 | "dev": true
673 | },
674 | "supports-color": {
675 | "version": "6.0.0",
676 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
677 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
678 | "dev": true,
679 | "requires": {
680 | "has-flag": "^3.0.0"
681 | }
682 | },
683 | "typescript": {
684 | "version": "2.9.2",
685 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
686 | "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
687 | "dev": true
688 | },
689 | "which": {
690 | "version": "1.3.1",
691 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
692 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
693 | "dev": true,
694 | "requires": {
695 | "isexe": "^2.0.0"
696 | }
697 | },
698 | "which-module": {
699 | "version": "2.0.0",
700 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
701 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
702 | "dev": true
703 | },
704 | "wide-align": {
705 | "version": "1.1.3",
706 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
707 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
708 | "dev": true,
709 | "requires": {
710 | "string-width": "^1.0.2 || 2"
711 | }
712 | },
713 | "wrap-ansi": {
714 | "version": "5.1.0",
715 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
716 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
717 | "dev": true,
718 | "requires": {
719 | "ansi-styles": "^3.2.0",
720 | "string-width": "^3.0.0",
721 | "strip-ansi": "^5.0.0"
722 | },
723 | "dependencies": {
724 | "ansi-regex": {
725 | "version": "4.1.0",
726 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
727 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
728 | "dev": true
729 | },
730 | "string-width": {
731 | "version": "3.1.0",
732 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
733 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
734 | "dev": true,
735 | "requires": {
736 | "emoji-regex": "^7.0.1",
737 | "is-fullwidth-code-point": "^2.0.0",
738 | "strip-ansi": "^5.1.0"
739 | }
740 | },
741 | "strip-ansi": {
742 | "version": "5.2.0",
743 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
744 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
745 | "dev": true,
746 | "requires": {
747 | "ansi-regex": "^4.1.0"
748 | }
749 | }
750 | }
751 | },
752 | "wrappy": {
753 | "version": "1.0.2",
754 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
755 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
756 | "dev": true
757 | },
758 | "y18n": {
759 | "version": "4.0.0",
760 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
761 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
762 | "dev": true
763 | },
764 | "yargs": {
765 | "version": "13.3.2",
766 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
767 | "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
768 | "dev": true,
769 | "requires": {
770 | "cliui": "^5.0.0",
771 | "find-up": "^3.0.0",
772 | "get-caller-file": "^2.0.1",
773 | "require-directory": "^2.1.1",
774 | "require-main-filename": "^2.0.0",
775 | "set-blocking": "^2.0.0",
776 | "string-width": "^3.0.0",
777 | "which-module": "^2.0.0",
778 | "y18n": "^4.0.0",
779 | "yargs-parser": "^13.1.2"
780 | },
781 | "dependencies": {
782 | "ansi-regex": {
783 | "version": "4.1.0",
784 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
785 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
786 | "dev": true
787 | },
788 | "string-width": {
789 | "version": "3.1.0",
790 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
791 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
792 | "dev": true,
793 | "requires": {
794 | "emoji-regex": "^7.0.1",
795 | "is-fullwidth-code-point": "^2.0.0",
796 | "strip-ansi": "^5.1.0"
797 | }
798 | },
799 | "strip-ansi": {
800 | "version": "5.2.0",
801 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
802 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
803 | "dev": true,
804 | "requires": {
805 | "ansi-regex": "^4.1.0"
806 | }
807 | }
808 | }
809 | },
810 | "yargs-parser": {
811 | "version": "13.1.2",
812 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
813 | "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
814 | "dev": true,
815 | "requires": {
816 | "camelcase": "^5.0.0",
817 | "decamelize": "^1.2.0"
818 | }
819 | },
820 | "yargs-unparser": {
821 | "version": "1.6.0",
822 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
823 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
824 | "dev": true,
825 | "requires": {
826 | "flat": "^4.1.0",
827 | "lodash": "^4.17.15",
828 | "yargs": "^13.3.0"
829 | }
830 | }
831 | }
832 | }
833 |
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "radeon-gpu-analyzer",
3 | "displayName": "Radeon GPU Analyzer",
4 | "description": "VSCode Interface for AMD's RGA (Radeon GPU Analyzer).",
5 | "version": "1.1.1",
6 | "publisher": "dbaumeis",
7 | "license": "MIT",
8 | "engines": {
9 | "vscode": "^1.44.0"
10 | },
11 | "categories": [
12 | "Other"
13 | ],
14 | "activationEvents": [
15 | "*"
16 | ],
17 | "main": "./out/src/extension",
18 | "contributes": {
19 | "commands": [
20 | {
21 | "command": "extension.callRga.dx11",
22 | "title": "Call RGA: DX11"
23 | },
24 | {
25 | "command": "extension.callRga.dx12",
26 | "title": "Call RGA: DX12"
27 | },
28 | {
29 | "command": "extension.callRga.vulkan",
30 | "title": "Call RGA: Vulkan"
31 | },
32 | {
33 | "command": "extension.callRga.spirv",
34 | "title": "Call RGA: SPIR-V"
35 | },
36 | {
37 | "command": "extension.callRga.amdil",
38 | "title": "Call RGA: AMD IL"
39 | },
40 | {
41 | "command": "extension.replayRga",
42 | "title": "Replay RGA"
43 | }
44 | ],
45 | "menus": {
46 | "editor/context": [
47 | {
48 | "when": "resourceLangId == hlsl",
49 | "command": "extension.callRga.dx11",
50 | "group": "2_rga"
51 | },
52 | {
53 | "when": "resourceLangId == hlsl",
54 | "command": "extension.callRga.dx12",
55 | "group": "2_rga"
56 | },
57 | {
58 | "when": "resourceLangId == vulkan",
59 | "command": "extension.callRga.vulkan",
60 | "group": "2_rga"
61 | },
62 | {
63 | "when": "resourceLangId == spirv",
64 | "command": "extension.callRga.spirv",
65 | "group": "2_rga"
66 | },
67 | {
68 | "when": "resourceLangId == amdil",
69 | "command": "extension.callRga.amdil",
70 | "group": "2_rga"
71 | },
72 | {
73 | "when": "resourceLangId == hlsl",
74 | "command": "extension.replayRga",
75 | "group": "2_rga"
76 | },
77 | {
78 | "when": "resourceLangId == vulkan",
79 | "command": "extension.replayRga",
80 | "group": "2_rga"
81 | },
82 | {
83 | "when": "resourceLangId == spirv",
84 | "command": "extension.replayRga",
85 | "group": "2_rga"
86 | },
87 | {
88 | "when": "resourceLangId == amdil",
89 | "command": "extension.replayRga",
90 | "group": "2_rga"
91 | }
92 | ]
93 | },
94 | "keybindings": [
95 | {
96 | "command": "extension.replayRga",
97 | "key": "f7"
98 | }
99 | ],
100 | "configuration": {
101 | "type": "object",
102 | "title": "RGA Configuration",
103 | "properties": {
104 | "rga.path": {
105 | "type": "string",
106 | "default": "rga.exe",
107 | "description": "Path to the RGA executable. Get it from here: https://github.com/GPUOpen-Tools/RGA/releases"
108 | },
109 | "rga.arguments.dx11": {
110 | "type": "string",
111 | "default": "",
112 | "description": "Define additional arguments to pass to RGA - DX11, e.g. '--intrinsics --UAVSlot 63'"
113 | },
114 | "rga.arguments.dx12": {
115 | "type": "string",
116 | "default": "",
117 | "description": "Define additional arguments to pass to RGA - DX12, e.g. '--intrinsics --UAVSlot 63'"
118 | },
119 | "rga.arguments.vulkan": {
120 | "type": "string",
121 | "default": "",
122 | "description": "Define additional arguments to pass to RGA - Vulkan, e.g. '--cfg control_flow_graph'"
123 | },
124 | "rga.arguments.spirv": {
125 | "type": "string",
126 | "default": "",
127 | "description": "Define additional arguments to pass to RGA - SPIR-V, e.g. '--cfg control_flow_graph'"
128 | },
129 | "rga.arguments.amdil": {
130 | "type": "string",
131 | "default": "",
132 | "description": "Define additional arguments to pass to RGA - AMD IL, e.g. '--cfg control_flow_graph'"
133 | },
134 | "rga.viewColumn.il": {
135 | "type": "number",
136 | "default": 1,
137 | "description": "Number of the view column the output IL will be shown (1, 2 or 3). Pass in -1 if you don't want to open the IL."
138 | },
139 | "rga.viewColumn.isa": {
140 | "type": "number",
141 | "default": 2,
142 | "description": "Number of the view column the output ISA will be shown (1, 2 or 3). Pass in -1 if you don't want to open the ISA."
143 | }
144 | }
145 | }
146 | },
147 | "scripts": {
148 | "vscode:prepublish": "tsc -p ./",
149 | "compile": "tsc -watch -p ./"
150 | },
151 | "devDependencies": {
152 | "@types/mocha": "^2.2.48",
153 | "@types/node": "^6.14.11",
154 | "@types/vscode": "^1.49.0",
155 | "mocha": "^6.2.3",
156 | "typescript": "^2.9.2"
157 | },
158 | "repository": {
159 | "type": "git",
160 | "url": "https://github.com/GPUOpen-Tools/vscode-extensions.git"
161 | }
162 | }
163 |
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/amdilCommand.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { RgaCommand } from './rgaCommand';
3 |
4 | export class AmdilCommand extends RgaCommand
5 | {
6 | protected getOptions()
7 | {
8 | var config = vscode.workspace.getConfiguration('rga');
9 | var userDefineOptions = config.get('arguments.amdil');
10 | var options = new Array<[string, string]>(
11 | ['-s', 'amdil'],
12 | ['-c', this.getTargetAsic()],
13 | ['--isa', this.getIsaPath()],
14 | ['', userDefineOptions],
15 | ['', this.getSourcePath()],
16 | ['', this.getCustomArguments()]
17 | );
18 | return options;
19 | }
20 |
21 | protected getInitializingFunctions()
22 | {
23 | return [];
24 | }
25 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/dx11Command.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { RgaCommand } from './rgaCommand';
3 |
4 | export class Dx11Command extends RgaCommand
5 | {
6 | private targetProfile = '';
7 |
8 | private initializeTargetProfile() : Thenable
9 | {
10 | var picks = ['cs_5_0',
11 | 'ps_5_0',
12 | 'vs_5_0',
13 | 'ds_5_0',
14 | 'gs_5_0',
15 | 'hs_5_0',
16 | 'lib_5_0'];
17 | return super.showQuickPick(picks, "Shader model.", (pick) => {
18 | this.targetProfile = pick;
19 | })
20 | }
21 |
22 | protected getOptions()
23 | {
24 | var config = vscode.workspace.getConfiguration('rga');
25 | var userDefineOptions = config.get('arguments.dx11');
26 | var options = new Array<[string, string]>(
27 | ['-s', 'dx11'],
28 | ['-c', this.getTargetAsic()],
29 | ['--isa', this.getIsaPath()],
30 | ['--il', this.getIlPath()],
31 | ['-f', this.getFirstSelection()], // entry point
32 | ['-p', this.targetProfile],
33 | ['', userDefineOptions],
34 | ['', this.getSourcePath()],
35 | ['', this.getCustomArguments()]
36 | );
37 | return options;
38 | }
39 |
40 | protected getInitializingFunctions()
41 | {
42 | var methods = [
43 | () => {return this.initializeTargetProfile()}
44 | ];
45 | return methods;
46 | }
47 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/dx12Command.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { RgaCommand } from './rgaCommand';
3 |
4 | export class Dx12Command extends RgaCommand
5 | {
6 | private targetProfile = '';
7 | private gpsoPath = '';
8 | private stages = [];
9 |
10 | protected initializeCustomArguments() : Thenable
11 | {
12 | return super.pickCustomArguments("Custom arguments - Use '--rs-bin ' if your root signature is not already defined in the file.");
13 | }
14 |
15 | private initializeTargetProfile() : Thenable
16 | {
17 | var picks = ['6_0', '6_1', '5_0', '5_1', '6_2', '6_3', '6_4'];
18 | return super.showQuickPick(picks, "Shader model.", (pick) => {
19 | this.targetProfile = pick;
20 | })
21 | }
22 |
23 | private initializeGpsoPath() : Thenable
24 | {
25 | return this.showQuickCustomPicks("gpsoPath", ".gpso path - Leave empty for compute shaders.", (pick) => {
26 | this.gpsoPath = pick;
27 | return true;
28 | });
29 | }
30 |
31 | private initializeShaderStage(entryPoint : string) : Thenable
32 | {
33 | var picks = ['vs', 'ps', 'cs', 'gs', 'hs', 'ds'];
34 | return super.showQuickPick(picks, "Shader stage for " + entryPoint, pick => {
35 | this.stages.push("--" + pick + "-entry " + entryPoint);
36 | });
37 | }
38 |
39 | protected getOptions()
40 | {
41 | var config = vscode.workspace.getConfiguration('rga');
42 | var userDefineOptions = config.get('arguments.dx12');
43 | var options = new Array<[string, string]>(
44 | ['-s', 'dx12'],
45 | ['-c', this.getTargetAsic()],
46 | ['--isa', this.getIsaPath()],
47 | ['--all-hlsl', this.getSourcePath()],
48 | ['--all-model', this.targetProfile],
49 | ['', userDefineOptions],
50 | ['', this.getCustomArguments()],
51 | ['', this.stages.join(' ')]
52 | );
53 |
54 | if(this.gpsoPath !== '')
55 | {
56 | options.push(['--gpso', '"' + this.gpsoPath + '"']);
57 | }
58 |
59 | return options;
60 | }
61 |
62 | protected getInitializingFunctions()
63 | {
64 | var methods = [];
65 | var selections = this.getSelections();
66 | selections.forEach(selection => {
67 | if(selection !== '')
68 | {
69 | methods.push(() => {return this.initializeShaderStage(selection)});
70 | }
71 | });
72 |
73 | methods = methods.concat([
74 | () => {return this.initializeTargetProfile()},
75 | () => {return this.initializeGpsoPath()}
76 | ]);
77 | return methods;
78 | }
79 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/extension.ts:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | // The module 'vscode' contains the VS Code extensibility API
3 | // Import the module and reference it with the alias vscode in your code below
4 | import * as vscode from 'vscode';
5 | import { RgaCommand } from './rgaCommand';
6 | import { Dx11Command } from './dx11Command';
7 | import { Dx12Command } from './dx12Command';
8 | import { VulkanCommand } from './vulkanCommand';
9 | import { SpirvCommand } from './spirvCommand';
10 | import { AmdilCommand } from './amdilCommand';
11 |
12 | function openTextDocumentSilent(uri : vscode.Uri, viewColumn : vscode.ViewColumn) : void
13 | {
14 | try {
15 | vscode.workspace.openTextDocument(uri.path).then((textDocument) => {
16 | if(!textDocument.isClosed)
17 | {
18 | vscode.window.showTextDocument(textDocument, viewColumn, true);
19 | }
20 | }, _ => console.log("Could not open " + uri.fsPath));
21 | } catch (error) {
22 | console.log("Could not open " + uri.fsPath);
23 | }
24 | }
25 |
26 | function openIsaFile(uri : vscode.Uri) : void
27 | {
28 | var config = vscode.workspace.getConfiguration('rga');
29 | var isaColumn = config.get('viewColumn.isa');
30 | if(isaColumn != -1)
31 | {
32 | isaColumn = Math.min(Math.max(isaColumn, 1), 3);
33 | openTextDocumentSilent(uri, isaColumn);
34 | }
35 | }
36 |
37 | function openIlFile(uri : vscode.Uri) : void
38 | {
39 | var config = vscode.workspace.getConfiguration('rga');
40 | var ilColumn = config.get('viewColumn.il');
41 | if(ilColumn != -1)
42 | {
43 | ilColumn = Math.min(Math.max(ilColumn, 1), 3);
44 | openTextDocumentSilent(uri, ilColumn);
45 | }
46 | }
47 |
48 | function executeCommand(command : RgaCommand, replayMap : Map)
49 | {
50 | let execute = async () => {
51 | if(await command.initializeCommand())
52 | {
53 | replayMap.set(vscode.window.activeTextEditor.document.uri.path, command);
54 | command.execute();
55 | }
56 | }
57 | execute();
58 | }
59 |
60 | // this method is called when your extension is activated
61 | // your extension is activated the very first time the command is executed
62 | export function activate(context: vscode.ExtensionContext)
63 | {
64 | let replayMap = new Map();
65 |
66 | let ilFileSystemWatcher = vscode.workspace.createFileSystemWatcher("**/*.il", false, false, true);
67 | ilFileSystemWatcher.onDidCreate(openIlFile);
68 | ilFileSystemWatcher.onDidChange(openIlFile);
69 | let isaFileSystemWatcher = vscode.workspace.createFileSystemWatcher("**/*.isa", false, false, true);
70 | isaFileSystemWatcher.onDidCreate(openIsaFile);
71 | isaFileSystemWatcher.onDidChange(openIsaFile);
72 |
73 | // only create one output channel that is shared for each invocation.
74 | var output = vscode.window.createOutputChannel("RGA Output");
75 |
76 | let callRgaDisposableDx11 = vscode.commands.registerCommand('extension.callRga.dx11', (editor) => {
77 | var command = new Dx11Command(context, output);
78 | executeCommand(command, replayMap);
79 | })
80 |
81 | let callRgaDisposableDx12 = vscode.commands.registerCommand('extension.callRga.dx12', (editor) => {
82 | var command = new Dx12Command(context, output);
83 | executeCommand(command, replayMap);
84 | })
85 |
86 | let callRgaDisposableVulkan = vscode.commands.registerCommand('extension.callRga.vulkan', (editor) => {
87 | var command = new VulkanCommand(context, output);
88 | executeCommand(command, replayMap);
89 | })
90 |
91 | let callRgaDisposableSpirv = vscode.commands.registerCommand('extension.callRga.spirv', (editor) => {
92 | var command = new SpirvCommand(context, output);
93 | executeCommand(command, replayMap);
94 | })
95 |
96 | let callRgaDisposableAmdil = vscode.commands.registerCommand('extension.callRga.amdil', (editor) => {
97 | var command = new AmdilCommand(context, output);
98 | executeCommand(command, replayMap);
99 | })
100 |
101 | let replayDisposable = vscode.commands.registerCommand('extension.replayRga', (editor) => {
102 | var command = replayMap.get(vscode.window.activeTextEditor.document.uri.path);
103 | if(command)
104 | {
105 | command.execute();
106 | }
107 | })
108 |
109 | context.subscriptions.push(ilFileSystemWatcher);
110 | context.subscriptions.push(isaFileSystemWatcher);
111 | context.subscriptions.push(callRgaDisposableAmdil);
112 | context.subscriptions.push(callRgaDisposableSpirv);
113 | context.subscriptions.push(callRgaDisposableVulkan);
114 | context.subscriptions.push(callRgaDisposableDx11);
115 | context.subscriptions.push(callRgaDisposableDx12);
116 | context.subscriptions.push(replayDisposable);
117 | }
118 |
119 | // this method is called when your extension is deactivated.
120 | export function deactivate()
121 | {
122 | // nothing to do here
123 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/rgaCommand.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import {QuickPickItem} from 'vscode';
3 | import * as child from 'child_process';
4 |
5 | export abstract class RgaCommand
6 | {
7 | private sourcePath = '';
8 | private isaPath = '';
9 | private ilPath = '';
10 | private targetAsic = '';
11 | private selections = [];
12 | private output : vscode.OutputChannel;
13 | private context: vscode.ExtensionContext;
14 |
15 | private static RING_SIZE = 10; // Controls the number of custom arguments to cache.
16 | private customArguments = '';
17 |
18 | constructor (context: vscode.ExtensionContext, output : vscode.OutputChannel)
19 | {
20 | this.output = output;
21 | this.context = context;
22 | }
23 |
24 | protected getSourcePath() : string
25 | {
26 | return this.sourcePath;
27 | }
28 |
29 | protected getIsaPath() : string
30 | {
31 | return this.isaPath;
32 | }
33 |
34 | protected getIlPath() : string
35 | {
36 | return this.ilPath;
37 | }
38 |
39 | protected getTargetAsic() : string
40 | {
41 | return this.targetAsic;
42 | }
43 |
44 | protected getFirstSelection() : string
45 | {
46 | return this.selections[0];
47 | }
48 |
49 | protected getSelections() : string[]
50 | {
51 | return this.selections;
52 | }
53 |
54 | protected getOutputChannel() : vscode.OutputChannel
55 | {
56 | return this.output;
57 | }
58 |
59 | protected getContex() : vscode.ExtensionContext
60 | {
61 | return this.context;
62 | }
63 |
64 | protected getCustomArguments() : string
65 | {
66 | return this.customArguments;
67 | }
68 |
69 | protected initializeSourcePath() : boolean
70 | {
71 | this.sourcePath = '"' + vscode.window.activeTextEditor.document.uri.fsPath + '"';
72 | return true;
73 | }
74 |
75 | private initializeIsaPath() : boolean
76 | {
77 | this.isaPath = '"' + vscode.window.activeTextEditor.document.uri.fsPath + '.isa' + '"';
78 | return true;
79 | }
80 |
81 | private initializeIlPath() : boolean
82 | {
83 | this.ilPath = '"' + vscode.window.activeTextEditor.document.uri.fsPath + '.il' + '"';
84 | return true;
85 | }
86 |
87 | protected initializeSelections() : boolean
88 | {
89 | var selections = vscode.window.activeTextEditor.selections;
90 | var success = true;
91 | selections.forEach(selection => {
92 | var text = vscode.window.activeTextEditor.document.getText(selection);
93 |
94 | var regex = new RegExp('^[a-zA-Z][a-zA-Z0-9]*$');
95 | var match = text.match(regex);
96 |
97 | if(match === null || match.length !== 1)
98 | {
99 | vscode.window.showInformationMessage("Please select only whole words as entry points.")
100 | success = false;
101 | }
102 |
103 | this.selections.push(text);
104 | });
105 | return success;
106 | }
107 |
108 | private initializeTargetAsic() : Thenable
109 | {
110 | // TODO query from rga
111 | var picks = ['gfx1010', 'gfx1012', 'gfx906', 'gfx902', 'gfx900', 'Ellesmere', 'Fiji',
112 | 'Baffin', 'Bonaire', '"Bristol Ridge"', 'Capeverde',
113 | 'Carrizo', 'Hainan', 'Hawaii',
114 | 'Iceland', 'Kalindi', 'Mullins', 'Oland',
115 | 'Pitcairn', 'Spectre', 'Spooky', 'Stoney',
116 | 'Tahiti', 'Tonga', 'gfx804'];
117 |
118 | return this.showQuickPick(picks, "Target ASIC.", (pick) => {
119 | this.targetAsic = pick;
120 | });
121 | }
122 |
123 | private storePick(pick : string, key : string)
124 | {
125 | var picks = this.loadPicks(key);
126 | // Only keep a small number of picks here, so even if we use an array this should be reasonably fast.
127 | var found : boolean = false;
128 | var foundIndex = 0;
129 | for(var i = 0; i < picks.length; ++i)
130 | {
131 | if(picks[i] == pick)
132 | {
133 | found = true;
134 | foundIndex = i;
135 | break;
136 | }
137 | }
138 |
139 | var next = this.context.globalState.get("RgaCommand." + key + ".next");
140 | if(!next)
141 | {
142 | next = 0;
143 | }
144 |
145 | if(!found)
146 | {
147 | if(picks.length < RgaCommand.RING_SIZE)
148 | {
149 | picks.push(pick);
150 | this.context.globalState.update("RgaCommand." + key, picks);
151 | }
152 | else
153 | {
154 | // Need to replace the next pick in the ring.
155 | picks[next] = pick;
156 | next = (next + 1) % RgaCommand.RING_SIZE;
157 | this.context.globalState.update("RgaCommand." + key + ".next", next);
158 | this.context.globalState.update("RgaCommand." + key, picks);
159 | }
160 | }
161 | else
162 | {
163 | // Make sure the pick is moved to the front.
164 | var last = (next + picks.length - 1) % picks.length;
165 | var tmp = picks[last];
166 | picks[last] = picks[foundIndex];
167 | picks[foundIndex] = tmp;
168 | this.context.globalState.update("RgaCommand." + key, picks);
169 | }
170 | }
171 |
172 | private loadPicks(key : string) : Array
173 | {
174 | var customArguments = this.context.globalState.get>("RgaCommand." + key);
175 | var picks = new Array();
176 | if(customArguments)
177 | {
178 | picks = picks.concat(customArguments);
179 | }
180 | return picks;
181 | }
182 |
183 | private reorderPicks(picks : Array, key : string) : Array
184 | {
185 | // reorder the elements: last pick has to be on top
186 | var next = this.context.globalState.get("RgaCommand." + key + ".next");
187 | if(!next)
188 | {
189 | next = 0;
190 | }
191 |
192 | var reorderedPicks = new Array(picks.length);
193 | for(var i = 0; i < reorderedPicks.length; ++i)
194 | {
195 | var j = (next + picks.length - 1 - i) % picks.length;
196 | reorderedPicks[i] = picks[j];
197 | }
198 | return reorderedPicks;
199 | }
200 |
201 | protected pickCustomArguments(text : string) : Thenable
202 | {
203 | return this.showQuickCustomPicks("customArguments", text, (pick) => {
204 | this.customArguments = pick;
205 | return true;
206 | });
207 | }
208 |
209 | protected initializeCustomArguments() : Thenable
210 | {
211 | return this.pickCustomArguments("Custom arguments - Leave empty to skip.");
212 | }
213 |
214 | public async initializeCommand() : Promise
215 | {
216 | this.initializeSelections();
217 |
218 | var methods = [];
219 | methods.push(
220 | () => {return this.initializeTargetAsic()},
221 | () => {return this.initializeSourcePath()},
222 | () => {return this.initializeIsaPath()},
223 | () => {return this.initializeIlPath()}
224 | );
225 |
226 | methods = methods.concat(this.getInitializingFunctions());
227 |
228 | methods.push(
229 | () => {return this.initializeCustomArguments()}
230 | );
231 | return this.callAll(methods);
232 | }
233 |
234 | private async callAll(methods : (() => Thenable | boolean)[]) : Promise
235 | {
236 | for(var i = 0; i < methods.length; ++i)
237 | {
238 | if(! await methods[i]())
239 | {
240 | return false;
241 | }
242 | }
243 | return true; // Success
244 | }
245 |
246 | protected buildCommandString()
247 | {
248 | var options = this.getOptions();
249 | var opts = new Array();
250 | options.forEach((element) => opts.push(element[0] + ' ' + element[1]));
251 | var config = vscode.workspace.getConfiguration('rga');
252 | var rgaPath = config.get('path');
253 | return rgaPath + ' ' + opts.join(' ');
254 | }
255 |
256 | protected async showQuickPick(picks : string[], hint : string, method : (pick) => void)
257 | {
258 | var promise = vscode.window.showQuickPick(picks, {placeHolder : hint});
259 | promise.then((pick) => {
260 | if(pick)
261 | {
262 | method(pick);
263 | return true;
264 | }
265 | return false;
266 | });
267 | return promise;
268 | }
269 |
270 | // Shows quick picks but also lets the user insert custom strings. This is not currently supported by the VS Code API, thus we have to get creative :(
271 | protected async showQuickInput(picks : string[], hint : string, method : (input) => void)
272 | {
273 | var disposables = [];
274 | try {
275 | var promise = new Promise((resolve, _) => {
276 | var quickPick = vscode.window.createQuickPick();
277 | quickPick.placeholder = hint;
278 | var resolved = false;
279 | var tmpPicks = [""].concat(picks);
280 | quickPick.items = tmpPicks.map(label => ({label}));
281 | quickPick.onDidChangeValue((value) => {
282 | tmpPicks = [value].concat(picks);
283 | quickPick.items = tmpPicks.map(label => ({label}));
284 | });
285 | quickPick.onDidAccept(() => {
286 | resolved = true;
287 | quickPick.hide();
288 | });
289 | quickPick.onDidHide(() => {
290 | if(resolved) {
291 | resolve(quickPick.selectedItems[0])
292 | }
293 | else {
294 | resolve(undefined);
295 | }
296 | });
297 | quickPick.show();
298 | });
299 | promise.then((pick : vscode.QuickPickItem) => {
300 | if(pick)
301 | {
302 | method(pick.label);
303 | return true;
304 | }
305 | return false;
306 | });
307 | return promise;
308 | }
309 | finally {
310 | disposables.forEach(element => element.dispose());
311 | }
312 | }
313 |
314 | // Shows quick pick that lets the user also insert custom strings. Caches the last RING_SIZE custom arguments as additional quick picks.
315 | protected showQuickCustomPicks(key : string, hint : string, method : (pick) => boolean) : Thenable
316 | {
317 | var picks = this.loadPicks(key);
318 | picks = this.reorderPicks(picks, key);
319 | return this.showQuickInput(picks, hint, (pick) => {
320 | if(method(pick) && pick !== "")
321 | {
322 | this.storePick(pick, key);
323 | }
324 | });
325 | }
326 |
327 | public execute() : void
328 | {
329 | var commandLine = this.buildCommandString();
330 | var rga : child.ChildProcess = child.exec(commandLine, (error: Error, stdout: string, stderr: string) => {
331 | this.output.show(true);
332 | this.output.appendLine(commandLine);
333 | this.output.appendLine(stdout);
334 | });
335 | }
336 |
337 | // Provide a way for the implementing command to add its own command line options.
338 | protected abstract getOptions() : Array<[string, string]>
339 |
340 | // Initializing code has to go here.
341 | protected abstract getInitializingFunctions() : Array<(() => Thenable | boolean)>
342 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/spirvCommand.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { RgaCommand } from './rgaCommand';
3 |
4 | export class SpirvCommand extends RgaCommand
5 | {
6 | protected getOptions()
7 | {
8 | var config = vscode.workspace.getConfiguration('rga');
9 | var userDefineOptions = config.get('arguments.spirv');
10 | var options = new Array<[string, string]>(
11 | ['-s', 'vk-spv-txt-offline'],
12 | ['-c', this.getTargetAsic()],
13 | ['--isa', this.getIsaPath()],
14 | ['--il', this.getIlPath()],
15 | ['', userDefineOptions],
16 | ['', this.getSourcePath()],
17 | ['', this.getCustomArguments()]
18 | );
19 | return options;
20 | }
21 |
22 | protected getInitializingFunctions()
23 | {
24 | return [];
25 | }
26 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/src/vulkanCommand.ts:
--------------------------------------------------------------------------------
1 | import * as vscode from 'vscode';
2 | import { RgaCommand } from './rgaCommand';
3 |
4 | export class VulkanCommand extends RgaCommand
5 | {
6 | private targetProfile = '';
7 |
8 | private initializeTargetProfile() : Thenable
9 | {
10 | // TODO query from file extension
11 | var picks = ['comp', 'frag', 'vert', 'tesc', 'tese', 'geom'];
12 | return super.showQuickPick(picks, "Shader type.", (pick) => {
13 | this.targetProfile = pick;
14 | })
15 | }
16 |
17 | protected getOptions()
18 | {
19 | var config = vscode.workspace.getConfiguration('rga');
20 | var userDefineOptions = config.get('arguments.vulkan');
21 | var options = new Array<[string, string]>(
22 | ['-s', 'vulkan'],
23 | ['-c', this.getTargetAsic()],
24 | ['--isa', this.getIsaPath()],
25 | ['--il', this.getIlPath()],
26 | ['', userDefineOptions],
27 | ['--' + this.targetProfile, this.getSourcePath()],
28 | ['', this.getCustomArguments()]
29 | );
30 | return options;
31 | }
32 |
33 | protected getInitializingFunctions()
34 | {
35 | var methods = [
36 | () => {return this.initializeTargetProfile()}
37 | ];
38 | return methods;
39 | }
40 | }
--------------------------------------------------------------------------------
/radeon-gpu-analyzer/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "es6",
5 | "outDir": "out",
6 | "lib": [
7 | "es6"
8 | ],
9 | "sourceMap": true,
10 | "rootDir": "."
11 | },
12 | "exclude": [
13 | "node_modules",
14 | ".vscode-test"
15 | ]
16 | }
--------------------------------------------------------------------------------